2016-07-27 96 views
1

下面是Python的2.7.12文檔(3.4.12新風格classes¶特殊方法查找。)讀出的代碼片段:爲什麼在這裏調用metaclass __getattribute__?

除了繞過任何實例中的 利益屬性正確性,隱特殊方法查找通常也繞過 的__getattribute__()方法,即使對象的元類:

>>> class Meta(type): 
... def __getattribute__(*args): 
...  print "Metaclass getattribute invoked" 
...  return type.__getattribute__(*args) 
... 
>>> class C(object): 
...  __metaclass__ = Meta 
...  def __len__(self): 
...   return 10 
...  def __getattribute__(*args): 
...   print "Class getattribute invoked" 
...   return object.__getattribute__(*args) 
... 
>>> c = C() 
>>> c.__len__()     # Explicit lookup via instance 
Class getattribute invoked 
10 
>>> type(c).__len__(c)   # Explicit lookup via type 
Metaclass getattribute invoked 
10 
>>> len(c)      # Implicit lookup 
10 

我的問題是,爲什麼metacl執行type(c).__len__(c)時調用屁股__getattribute__

由於type(c)產生C,此聲明可以改寫爲C.__len__(c)C.__len__是在類C中定義的未綁定方法,它可以在C.__dict__中找到,那麼爲什麼Meta涉及查找?

回答

2

來自同一文檔的報價3.4.2.1。新樣式類的更多屬性的訪問:

object.__getattribute__(self, name)

無條件實現屬性訪問的 實例類的。 ...

C是元類Meta的一個實例,因此Meta.__getattribute__是當C.__len__訪問調用,即使後者在C.__dict__找到。

實際上,訪問C.__dict__也是一個屬性訪問,因此Meta.__getattribute__仍然會被調用。