Python 从类或实例设置属性时,查找过程是什么?
简而言之,Python描述了 但我不确定何时设置属性: 设置属性 请注意,属性查找步骤仅如刚才所述 引用属性时,而不是绑定属性时。什么时候 绑定(在类或实例上)名称为的属性 不特殊(除非aPython 从类或实例设置属性时,查找过程是什么?,python,python-3.x,Python,Python 3.x,简而言之,Python描述了 但我不确定何时设置属性: 设置属性 请注意,属性查找步骤仅如刚才所述 引用属性时,而不是绑定属性时。什么时候 绑定(在类或实例上)名称为的属性 不特殊(除非a\uuuuuu setattr\uuuuu方法,或该\uuuu设置 重写描述符的方法,截取 实例属性),您只影响 属性(分别在类或实例中)。换句话说,, 对于属性绑定,不涉及任何查找过程,除了 用于检查覆盖描述符的 我的问题是: 从类中设置属性(例如cls.name=value)时,“查找”过程是什么 从对象
\uuuuuu setattr\uuuuu
方法,或该\uuuu设置
重写描述符的方法,截取
实例属性),您只影响
属性(分别在类或实例中)。换句话说,,
对于属性绑定,不涉及任何查找过程,除了
用于检查覆盖描述符的
我的问题是:
- 从类中设置属性(例如
)时,“查找”过程是什么cls.name=value
- 从对象设置属性(例如,
)时,“查找”过程是什么obj.name=value
方法 \uuuuu setattr\uuuuu(自我、姓名、价值) 每次请求绑定属性\uuuu setattr\uuuu
(通常是赋值语句x.y
,但是,例如,x.y=value
),Python调用setattr(x,'y',value)
。Python总是调用x.\uuuu setattr\uuuuu('y',值)
来处理任何 x上的属性绑定—与\uuuu setattr\uuuu
的一个主要区别是 更接近于\uuuu getattr\uuuuu
)。为了避免递归,当\uuu getattribute\uuu
x.\uuuu setattr\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。, 通过
);更好的是,x.\uuuuu dict\uuuuuu[name]=value
可以委托 设置到超类(通过调用\uuuuu setattr\uuuu
或者,在v3中,只需super(C,x)。\uuuu setattr\uuuu('y',value)
super()。Python忽略了
的返回值。如果\uuuu setattr\uuuu
不存在(即继承自\uuuu setattr\uuuu
),并且object
不是覆盖描述符,Python通常翻译C.y
进入x.y=z
x.\uuuu dict\uuuu['y']=z
- 重写描述符的
方法(所以我问)\uuuuuuuuuuuuuuuuuuu
- 属性的
条目(分别在类或实例中)\uuuu dict\uuuu
type
class),因此从类中设置属性的“查找”过程和从实例中设置属性的“查找”过程真的不同吗
谢谢。对于
x.y=z
,Python会以一种绕过\uuuu getattr\uuuuuuuu
、\uu getattr\uuuuuuu
和x
自己的\uuu dict\uuuuuuuuuuuu
的方式查找,然后调用x.\uuuu setattr\uuuuuuuuz('uuy',code>)
自定义的\uuuu setattr\uuuuuu
可以做任何它想做的事情,但这里是默认设置:
搜索类型(x)。\uuu mro\uuuuuuu
以查找与属性名称匹配的条目
如果此搜索使用\uuuu set\uuuuu
方法(查找\uuuu set\uuuuu
与查找\uuuu setattr\uuuuuu
的方法相同)找到描述符descr.\uuuu set\uuuuuuuuux,z)
2.a。在极不寻常的情况下,搜索找到的描述符带有\uuuuu delete\uuuuu
但没有\uuuu set\uuuuuu
,请引发属性错误
否则,设置x.\uuuuu dict\uuuu['y']=z
,或者如果x
没有\uuuuu dict\uuu
,则引发属性错误。(这使用了“真实的”\uuuu dict\uuuuu
,绕过了映射代理等功能)
这适用于类型和其他对象,但需要注意的是type.\uuuu setattr\uuuu
将拒绝设置用C编写的类的属性,和type.\uuuuu setattr\uuuuuu
执行一些额外的内部维护,您永远不需要担心,除非您执行一些疯狂的、不受支持的操作来绕过它。非常简单:它指定给该类的属性。它不涉及基类。这本书中的引用似乎并不简单。@Tim你的问题在第二句引用的最后一句中得到了回答:“换句话说,对于属性绑定,除了检查重写描述符之外,没有涉及任何查找过程。”我不确定我是否理解这句话,我认为这个句子不能代替整个段落,因为段落暗示仍然有一些“查找”过程,而且这个句子也遗漏了段落中的\uuuu setattr\uuu
方法@ChristianDean@Tim“您只影响属性的\u dict\u
条目”有什么复杂之处?谢谢。(1) 第一步是否意味着在类型(x)中查找一个class属性为y
的类?如果是,并且我们发现一个类可以是类型(x)
的祖先类,为什么在descr.\uuu set\uuuuuuuuuuu(x,z)
的第2步和x.\uu dict\uuuuuuuu['y']=z
的第3步中设置实例属性,而不是设置找到的类的class属性y
?(2) 当步骤1中的搜索未找到任何类时,或者当步骤1中的搜索找到某个类但在步骤2中找到的属性不是描述符时,是否会发生步骤3?(3)如果可以为每种情况添加一些示例,则会发生这种情况