3
之間hasattr()當我試圖檢查class
聲明的類型Python 3
和Python 2
,我得到了奇怪的結果,如以下顯示,差異類型()和Python 3和Python 2
>>> #python 2.7.6
>>> class MyClass:
... pass
...
>>> type(MyClass)
<type 'classobj'>
>>> hasattr(MyClass, '__call__')
False
的type
的MyClass
在Python 2
是classobj
和MyClass
沒有__call__
屬性。這是我期望的。
>>> #python 3.3.3
>>> class MyClass:
... pass
...
>>> type(MyClass)
<class 'type'>
>>> hasattr(MyClass, '__call__')
True
然而,在Python 3
的MyClass
的type
是class 'type'
,並MyClass
具有__call__
屬性,雖然我沒有在MyClass
聲明。
我猜的原因是,在Python 3
,MyClass
是type
,並type
有__call__
屬性,是嗎?爲什麼Python 3
改變type
函數的行爲?
感謝您的及時回覆!我有另一個問題。如果我設置'c = MyClass()',並且'callable(c)'將返回false,但hasattr(MyClass,'__call __')'返回true。那麼爲什麼'callable(c)'返回false? – mitchelllc
@mitchelllc您沒有重寫默認的'__call__',所以'callable(c)'顯示爲'False'。但是,如果你從'function'繼承,它將默認爲'callable()'。 – tyteen4a03
@ tyteen4a03好吧,我有點困惑。 'callable(c)'返回false,因爲我沒有覆蓋缺省的'__call__',但爲什麼'hasattr(MyClass,'__call __')'返回true?十分感謝! – mitchelllc