通常的属性访问方法要求属性名称为valid python identifiers。
但属性不一定是有效的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保留关键字等的属性,是否真的有任何有效的用例?我认为原因是属性只是对象/命名空间dict中的键,但这没有意义,因为不允许使用其他有效dict键的对象:
>>> setattr(t, ('tuple',), 321)
TypeError: attribute name must be string, not 'tuple'
答案 0 :(得分:1)
因此,为了回答用例问题,看看Python在上述评论的引用中如何工作的原因,我们可以推断出一些可能使Pythonic怪癖变得有用的情况。
答案 1 :(得分:1)