簡體   English   中英

X.__getitem__(1) vs type(X).__getitem__(X, 1)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM