从坚果壳中的Python
class B(object): def f(self): return 23 g = property(f) class C(B): def f(self): return 42 c = C() print(c.g) # prints: 23, not 42
... 该属性不执行该名称的查找,而是使用 它在创建时传递的函数对象。
如果您需要解决此问题,可以随时添加 自己额外的查找间接级别:
class B(object): def f(self): return 23 def _f_getter(self): return self.f() g = property(_f_getter) class C(B): def f(self): return 42 c = C() print(c.g) # prints: 42, as expected
这里,属性所持有的函数对象是B._f_getter,它是 反过来执行查找名称f(因为它调用self.f() )
“查找”在这里意味着什么?
“查找”在什么条件下发生?
管理self.f()
时属性不执行查找的规则是什么?
感谢。
答案 0 :(得分:4)
“查找”基本上意味着“取名并获得它指向的价值”。通常,在执行包含名称的行时会发生名称查找。
在第一个示例中,包含property(f)
的行仅在定义B
时执行一次。因此,名称f
仅在此时查找。每次访问f
时,obj.g
仍然会被称为,但在这种情况下,f
不会查找任何名称(它只会返回一个常量)。< / p>
在第二个示例中,包含property(_f_getter)
的行仍然只执行一次,因此_f_getter
仍然只查找一次。但是每次访问_f_getter
时,obj.g
都会被称为,因此_f_getter
内的行会在每次此类属性访问时执行。这意味着每个属性访问都会执行_f_getter
中的代码,并会查找self
(然后是self.f
)的值。
没有规则说“属性不执行查找”。问题是属性只创建一次,因此在属性的创建期间发生的任何查找只会发生一次。但是该属性导致在每次访问时调用一个函数,因此在该函数内发生的任何查找都将在每次访问时发生。