![](/img/trans.png)
[英]TypeError 'x' object has no attribute '__getitem__'
[英]X.__getitem__(1) vs type(X).__getitem__(X, 1)
class C:
data = 'spam'
def __getattr__(self, name):
print('getattr:', name)
return getattr(self.data, name)
X = C()
X.__getitem__(1) // <-- works!
type(X).__getitem__(X, 1) // <-- AttributeError: type object 'C' has no attribute '__getitem__'
既然type(X).__getitem__(X, 1)
在類 C 中找不到__getitem__
方法,難道不應該調用__getattr__(self, name)
函數嗎?
X.__getitem__(1)
在實例和類中找不到__getitem__
所以它調用__getattr__(self, name)
。
為什么一個有效,一個無效? 我讀到特殊方法查找會像X[1]
一樣跳過__getattr__
函數(如果隱式調用?),但是,在這種情況下我明確調用它。
特殊方法查找文檔的最后一部分顯示了繞過__getattribute__
時的異常。
根據使用__len__
方法的示例(下面復制),您的代碼中的type(X).__getitem__
將從元類中調用__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
使用此信息,可以解釋觀察到的行為:
X.__getitem__(1) # <-- works!
調用類C
__getattribute__
以查找__getitem__
,它返回綁定到字符串"spam"
的__getitem__
。 當用參數 1 調用時,返回位置 1 的字母p
。
但:
type(X).__getitem__(X, 1)
__getattribute__
來自C
元類將被調用,但它沒有在那里定義。 結果是AttributeError
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.