对于
x.y =z,Python的查找
x.__setattr__的方式绕过
__getattribute__,
__getattr__和
x自己的
__dict__,然后调用
x.__setattr__('y',z)。自定义
__setattr__可以执行任何所需的操作,但这是默认设置:
- 搜索
type(x).__mro__
一个__dict__
匹配的属性名称条目。 - 如果此搜索找到
descr
具有__set__
方法的描述符(以与查找__set__
方式相同的方式查找__setattr__
),请调用descr.__set__(x, z)
。
2a。在非常不寻常的情况下,搜索会找到一个带
__delete__但不带的描述符
__set__,并引发AttributeError。
- 否则,设置
x.__dict__['y'] = z
或引发AttributeError
if ifx
no__dict__
。(这使用“ real”__dict__
,绕过了诸如此类mappingproxy
。)
这适用于类型和其他对象,但要注意的是它们
type.__setattr__将拒绝设置用C编写的类的属性,并且
type.__setattr__会进行一些额外的内部维护,除非您疯狂地做一些不被支持的事情以绕过它,否则您将不必担心。



