16

このクラスを定義するとしましょう:

class A:
    pass

a = A()

明らかに、次のように属性を設定できます。

a.x = 5

しかし では、名前に空白を含む属性を指定setattrできます。a

setattr(a, 'white space', 1)
setattr(a, 'new\nline', None)

dir(a)とが含まれ'white space'てい'new\nline'ます。

.演算子を使用してこれらの属性にアクセスすることはできませんSyntaxError

>>> a.white space
  File "<interactive input>", line 1
    a.white space
                ^
SyntaxError: invalid syntax
>>> a.new\nline
  File "<interactive input>", line 1
    a.new\nline
              ^
SyntaxError: unexpected character after line continuation character

しかし、私はできるgetattr

>>> getattr(a, 'white space')
1
>>> getattr(a, 'new\nline')
None

この機能の背後にある理由はありますか? もしそうなら、それは何ですか?

これを利用する必要がありますか、それとも PEP8 で定義された標準に準拠する必要がありますか?

4

1 に答える 1

12

オブジェクト属性は、オブジェクトので定義された属性にすぎません__dict__。その観点から考えると、属性名に空白(またはに含めることができる他の文字)を許可することstrは完全に理にかなっています。

>>> class X(object):
...  pass
... 
>>> x = X()
>>> setattr(x, 'some attribute', 'foo')
>>> x.__dict__
{'some attribute': 'foo'}
>>> x.__dict__['some attribute']
'foo'

とは言うものの、Pythonの言語構文では、インタープリターがプログラムソースをプロパティトークン化(解析)する方法を知らないため、直接属性参照で空白を使用できません。どうしても必要な場合を除いて、直接属性参照を介してアクセスできる属性名を使用することに固執します。

于 2013-02-08T05:34:00.457 に答える