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

标签 python python-2.7 python-3.x

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

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

Python 2MyClasstypeclassobjMyClass有没有 __call__ 属性。这是我所期望的。

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

但是,在 Python 3 中,MyClasstypeclass 'type',并且 MyClass 具有 __call__ 属性,尽管我没有在 MyClass 中声明它。

我猜原因是在Python 3中,MyClass是一个type,而type__call__ 属性,我说得对吗?为什么 Python 3 会像这样改变 type 函数的行为?

最佳答案

改变的是 3.x 中的所有类默认都是新式类。您的 Python 2 类没有继承自 object,因此 Python 认为它是一个旧式类。

在 2.7.5 中:

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

关于python - Python 3 和 Python 2 之间 type() 和 hasattr() 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21174596/

相关文章:

python - 暂停命令行 python 程序的最简单方法?

python - 如何在Django中获取具有特定权限组的所有用户的列表

python-2.7 - pandas数据帧中大字符串列的高效存储

python - 我如何对以下词典列表进行排序?

python - 遍历 Python 列表并进行就地更改

python - 打开(名称 ,"rb")因为 f 不需要关闭,对吗?

python - 如何使用 Python 或其他语言将数据从 cassandra 导出到 Json 文件?

python pptx 将图像对齐到幻灯片中心

python - 将 flask_login session 与 jinja2 模板一起使用

python-3.x - 从另一个函数获取数字输入的函数,如果数字为负,则应该给出错误