运维开发网
广告位招商联系QQ:123077622
 
广告位招商联系QQ:123077622

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

运维开发网 https://www.qedev.com 2020-05-19 17:28 出处:网络 作者:运维开发网整理
当我试图在 Python 3和 Python 2中检查类声明的类型时,我得到了奇怪的结果,如下所示,
当我试图在 Python 3和 Python 2中检查类声明的类型时,我得到了奇怪的结果,如下所示,

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

Python 2中的MyClass类型是classobj,而MyClass没有__call__属性.这就是我的期望.

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

但是,在Python 3中,MyClass的类型是类’type’,而MyClass具有__call__属性,尽管我没有在MyClass中声明它.

我想原因是在Python 3中,MyClass是一个类型,类型有__call__属性,我是对的吗?为什么Python 3会像这样改变类型函数的行为?

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

在2.7.5:

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

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消