加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 12:05:43 所属栏目:Python 来源:网络整理
导读:当我试图在 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和 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读