什么时候查找名称,什么时候不查找?

时间:2017-06-27 21:15:41

标签: python python-3.x

从坚果壳中的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()时属性不执行查找的规则是什么?

感谢。

1 个答案:

答案 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)的值。

没有规则说“属性不执行查找”。问题是属性只创建一次,因此在属性的创建期间发生的任何查找只会发生一次。但是该属性导致在每次访问时调用一个函数,因此在该函数内发生的任何查找都将在每次访问时发生。