python - 为什么 setattr 和 getattr 允许空格?

标签 python attributes

假设我定义了这个类:

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 中定义的标准?

最佳答案

对象属性仅仅是在对象的 __dict__ 中定义的那些属性。如果您从这个角度考虑它,那么在属性名称中允许空格(或任何其他可以包含在 str 中的字符)是完全有意义的。

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

也就是说,Python 的语言语法不允许在直接属性引用中使用空格,因为解释器不知道如何对程序源进行属性标记化(解析)。我会坚持使用 attribute names除非您绝对需要这样做,否则可以通过直接属性引用访问。

关于python - 为什么 setattr 和 getattr 允许空格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14766196/

相关文章:

python - 如何使用XMLRPC备份数据库?

jsf - 需要复合组件 ="true"不被尊重

c - 如何在程序方法中获得一致的变量值?

python - mod_mime_magic : can't read `/opt/python/current/app/application.py'

python - 为什么我缺少 PYTHONPATH?

javascript - 面向对象的javascript : initialize an attribute with a self function call

jquery - 使用 jQuery 切换元素的属性?

c# - 如何通过属性在 C# 中搜索方法?

python - 查看页面源代码时发现抓取代码

python - Hashicorp python 客户端 hvac 问题 :- "bad handshake: Error([(' SSL routines', 'tls_process_server_certificate' 、 'certificate verify failed'