2014-01-16 103 views
3

之間hasattr()當我試圖檢查class聲明的類型Python 3Python 2,我得到了奇怪的結果,如以下顯示,差異類型()和Python 3和Python 2

>>> #python 2.7.6 
>>> class MyClass: 
...  pass 
... 
>>> type(MyClass) 
<type 'classobj'> 
>>> hasattr(MyClass, '__call__') 
False 

typeMyClassPython 2classobjMyClass沒有__call__屬性。這是我期望的。

>>> #python 3.3.3 
>>> class MyClass: 
...  pass 
... 
>>> type(MyClass) 
<class 'type'> 
>>> hasattr(MyClass, '__call__') 
True 

然而,在Python 3MyClasstypeclass 'type',並MyClass具有__call__屬性,雖然我沒有在MyClass聲明。

我猜的原因是,在Python 3MyClasstype,並type__call__屬性,是嗎?爲什麼Python 3改變type函數的行爲?

回答

10

改變的是,3.x中的所有類都默認爲新類。你的Python 2類沒有從object繼承,所以Python認爲它是一箇舊式的類。

在2.7.5:

>>> class MyClass(object): 
... pass 
... 
>>> type(MyClass) 
<type 'type'> 
>>> hasattr(MyClass, '__call__') 
True 
+0

感謝您的及時回覆!我有另一個問題。如果我設置'c = MyClass()',並且'callable(c)'將返回false,但hasattr(MyClass,'__call __')'返回true。那麼爲什麼'callable(c)'返回false? – mitchelllc

+0

@mitchelllc您沒有重寫默認的'__call__',所以'callable(c)'顯示爲'False'。但是,如果你從'function'繼承,它將默認爲'callable()'。 – tyteen4a03

+0

@ tyteen4a03好吧,我有點困惑。 'callable(c)'返回false,因爲我沒有覆蓋缺省的'__call__',但爲什麼'hasattr(MyClass,'__call __')'返回true?十分感謝! – mitchelllc