当我尝试检查class
和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
中,type
的{{1}}为MyClass
,而class 'type'
具有MyClass
属性,但我未声明它在__call__
内。
我想原因是在MyClass
,Python 3
是MyClass
,type
有type
属性,我是对的吗?为什么__call__
改变Python 3
函数的行为?
答案 0 :(得分:11)
默认情况下,3.x中的所有类都是新式类。你的Python 2类没有从object
继承,所以Python认为它是一个旧式的类。
在2.7.5:
>>> class MyClass(object):
... pass
...
>>> type(MyClass)
<type 'type'>
>>> hasattr(MyClass, '__call__')
True