Python 3和Python 2在type()和hasattr()上的区别

米切尔

当我试图检查的类型class声明中Python 3Python 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 3typeofMyClassclass 'type',并且MyClass具有__call__属性,尽管我未在中声明它MyClass

我想原因是在中Python 3MyClasstype,并且type具有__call__属性,对吗?为什么要Python 3改变type函数的行为呢?

伊格纳西奥·巴斯克斯(Ignacio Vazquez-Abrams)

更改的是,默认情况下,3.x中的所有类都是新样式类您的Python 2类没有继承自object,因此Python认为这是一个老式的类。

在2.7.5中:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章