所有类都是 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"""