Python 3和Python 2之间的type()和hasattr()的区别

时间:2014-01-16 22:53:15

标签: python python-2.7 python-3.x

当我尝试检查classPython 3Python 2声明的类型时,我会得到奇怪的结果,如下所示,

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

type中的MyClass Python 2classobjMyClass没有__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__内。

我想原因是在MyClassPython 3MyClasstypetype属性,我是对的吗?为什么__call__改变Python 3函数的行为?

1 个答案:

答案 0 :(得分:11)

默认情况下,3.x中的所有类都是新式类。你的Python 2类没有从object继承,所以Python认为它是一个旧式的类。

在2.7.5:

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