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

时间:2011-12-07 06:50:39

标签: python oop class object

我已经阅读了很多关于Python文档中的对象的内容,它们在某些方面区分了这两个:

  • 旧式实例独立于其类,使用单个内置类型实现,称为实例。
  • 新式类既不多于也不少于用户定义的类型。

任何人都可以向我解释这个“旧式(或经典)和新式”。

我无法弄清楚这条线试图说的是什么:

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

1 个答案:

答案 0 :(得分: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__是一项新功能,可以阻止在对象中添加dict()并仅为__slots__中的属性分配内存
  • python属性(@propertyproperty() ...)仅适用于新的类样式。

关于MRO,请查看文档The Python 2.3 Method Resolution Order。在2.2之前,实施是:

  首先是深度,然后是从左到右

虽然新的是C3,但更复杂但处理前一个没有正确处理的各种情况(检查Samuele Pedroni post on the python mailing list)。