2017-08-10 108 views
1

一個非常基本的問題。爲什麼參數傳遞給__getattribute__無法識別?

我有一些虛擬類:

class SomeClass: 
    """ just a docstring""" 

    a = 5 

目錄(SomeClass的),返回與此類關聯以下屬性:

>>> dir(SomeClass) 
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__form 
at__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_s 
ubclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', 
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclas 
shook__', '__weakref__', 'a'] 
>>> 

我注意到,如果我打個電話到SomeClass的.__ getattribute__ ,即使我通過一個參數(它說它需要),錯誤消息說我沒有通過任何參數。

>>> SomeClass.__getattribute__('a') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: expected 1 arguments, got 0 
>>> 

注 - 這並不是說我有一個用例爲希望以這種方式來調用__getattribute__。(事實上,這似乎是不正確的,我想將它稱爲SomeClass的實例,而不是它的工作)。 我只是好奇__getattribute__的行爲:爲什麼錯誤消息說它有0個參數,當我實際上傳遞參數?我並不質疑我的用法是不正確的 - 只是,爲什麼__getattribute__不能識別它是通過了一個參數呢?

我注意到__getattribute__被列爲'slotwrapper'。這是否與它有關?我很難弄清楚調用slotwrapper和調用函數之間的真正區別。由於我調用它的方式,這個slotwrapper拋棄了我通過它的論點嗎?

>>> SomeClass.__getattribute__ 
<slot wrapper '__getattribute__' of 'object' objects> 
>>> 

回答

0

您調用的函數__getattribute__是一種方法。它預計兩個的論點。第一個參數是self,通常是SomeClass的一個實例(當您通過實例調用時,通常會自動提供該實例:instance.__getattribute__)。第二個參數是要查找的屬性的名稱。

當您撥打SomeClass.__getattribute__("a")時,您通過"a"作爲self。這不是一件非常有用的事情。如果您也提供了第二個參數,它可能甚至可以工作(因爲從object繼承,因爲是str.__getattribute__)。它將查找您通過的字符串中的屬性,而不是與SomeClass相關的任何屬性。

唯一奇怪的行爲是它說得到零個參數(和預期的一個),而不是說它得到一個參數和期望兩個。 問題的一部分可能是(次要)錯誤。

+0

非常感謝您的解釋。我對錯誤信息本身非常困惑。這是一個與\ __ setattr \ __類似的問題,如果我在調用這個(不正確的)方法時傳遞了兩個參數,那麼錯誤消息表明它需要2個參數,但只接收1個。(看起來它應該真的期待3個參數 - 實例,要設置的屬性的名稱以及將其設置爲的值)。 – ffConundrums

+0

我懷疑是假的錯誤信息是因爲那些是用C編寫的方法(你從'object'繼承)。內建的方法有點奇怪。如果你用Python編寫你自己的方法,如果調用不正確,它會給出一個合適的錯誤信息。 – Blckknght

相關問題