Python: 旧式(经典)和新式对象的方法解析顺序

4 投票
1 回答
687 浏览
提问于 2025-04-17 07:52

我在Python文档中读了很多关于对象的内容,其中提到了一些区别,比如:

  • 旧式实例,不管它们属于哪个类,都是用一种叫做实例的内置类型来实现的。
  • 新式类就是用户自己定义的一种类型。

有人能给我解释一下“旧式(或经典)和新式”的意思吗?

我搞不懂这句话想表达什么:

“对于新式类,方法解析顺序会动态变化,以支持对super()的协作调用。”

1 个回答

6

旧的类风格:

class BaseClass:
    def m1(self):
        return 1

class MyClass(BaseClass):
    def m1(self):
        return BaseClass.m1(self)

新的类风格:

class BaseClass(object):
    def m1(self):
        return 1

class MyClass(BaseClass):
    def m1(self):
        return super(MyClass, self).m1()

使用新类风格有很多可能性,比如:

  • super(classname, ...).method() 代替 parentclassname.method(...)。现在,父类的方法是通过一种叫做MRO的顺序来确定的(之前是你自己来决定的)。
  • __slots__ 是一个新特性,可以防止在你的对象中添加一个字典,而只为 __slots__ 中的属性分配内存。
  • Python的属性(@property, property()等)只在新的类风格中有效。

关于MRO,可以查看文档 Python 2.3 方法解析顺序。在2.2之前,MRO的实现是:

深度优先,然后从左到右

而新的实现是C3,这种方式更复杂,但能处理之前处理不正确的各种情况(可以查看 Samuele Pedroni在Python邮件列表上的帖子)。

撰写回答