根据这个答案,
setattr(instance, name, value)
是instance.__setattr__(name, value)
的简写。但是:class C:
def __init__(self):
# OK.
super().__setattr__("foo", 123)
# AttributeError: 'super' object has no attribute 'foo'
setattr(super(), "foo", 123)
c = C()
怎么回事?难道它们不应该做同样的事情吗?
super()
的虚假性在使用setattr(super(), ...)
时就不再成立了,因为super()
实际上没有它所扮演的__mro__
。这种限制在官方文档中有记录吗?super()
文档中对于“使用语句或运算符进行隐式查找时未定义”有注释,但我认为这并不是一个隐式查找。 - Maxpmsetattr
不是显式的__setattr__
查找。 - user2357112super
文档,实际上它们非常糟糕。它们甚至没有足够的解释来说明super
的普通用法是如何工作的。尽管如此,它们确实解释了super
是通过实现__getattribute__
来工作的,而这种操作不会触发__getattribute__
。 - user2357112setattr(...)
和instance.__setattr__(...)
之间的区别。 - Ethan Furmansuper.__getattribute__
之间的差异,谈论tp_setattro
以及MRO搜索通常如何被优化掉,谈论描述符协议,谈论描述符协议也通常被优化掉等等。 - user2357112