所有类都是 Python 3 中的新式类
在 Python 3.x
中,所有类都是新式类 ; 在定义新类时,python 隐式地使它继承自 object
。因此,在 class
定义中指定 object
是完全可选的:
Python 3.x >= 3.0
class X: pass
class Y(object): pass
这两个类现在都包含了 object
(方法解析顺序):
Python 3.x >= 3.0
>>> X.__mro__
(__main__.X, object)
>>> Y.__mro__
(__main__.Y, object)
在 Python 中,2.x
类默认为旧式类; 他们并没有暗中继承 object
。这会导致类的语义不同,具体取决于我们是否明确添加 object
作为基础 class
:
Python 2.x >= 2.3
class X: pass
class Y(object): pass
在这种情况下,如果我们尝试打印 Y
的 __mro__
,将出现与 Python 3.x
案例类似的输出:
Python 2.x >= 2.3
>>> Y.__mro__
(<class '__main__.Y'>, <type 'object'>)
发生这种情况是因为我们在定义时明确地使 Y
继承自对象:class
Y(object): pass
。对于不从对象继承的 X
类,__mro__
属性不存在,尝试访问它会导致 AttributeError
。
为了确保两个版本的 Python 之间的兼容性,可以使用 object
作为基类定义类:
class mycls(object):
"""I am fully compatible with Python 2/3"""
或者,如果 __metaclass__
变量在全局范围内设置为 type
,则给定模块中所有后续定义的类都是隐式新样式,而无需显式继承 object
:
__metaclass__ = type
class mycls:
"""I am also fully compatible with Python 2/3"""