通常的属性访问方法要求属性名称是有效的 python 标识符.
但属性不必是有效的 python 标识符:
>>> class Thing:
... def __init__(self):
... setattr(self, '0potato', 123)
...
>>> t = Thing()
>>> Thing.__getattribute__(t, '0potato')
123
>>> getattr(t, '0potato')
123
当然,t.0potato
仍然是一个SyntaxError
,但该属性仍然存在:
>>> vars(t)
{'0potato': 123}
允许这样做的理由是什么?对于带有空格、空字符串、Python 保留关键字等的属性,真的有任何有效的用例吗?我认为原因是属性只是对象/命名空间字典中的键,但这没有意义,因为不允许作为有效字典键的其他对象:
>>> setattr(t, ('tuple',), 321)
TypeError: attribute name must be string, not 'tuple'
详细信息来自于comment在帖子上完全回答了这个问题,所以我将其发布为答案:
Guido says:
...它是一个feature您可以使用任意字符串
使用 getattr() 和 setattr()。然而这些函数应该(并且确实如此!)
拒绝非字符串。
可能的用例包括隐藏常规点访问的属性,以及使属性与外部数据源相对应(这可能与 Python 关键字冲突)。因此,争论似乎是根本没有充分的理由禁止它。
至于禁止非字符串的原因,这似乎是一个合理的限制,可以确保实现更高的性能:
尽管Python的字典已经有一些仅限字符串的优化——一旦第一个非键字符串出现,它们只是动态地适应更通用且稍慢的方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)