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

ifi*_*hat 4 python oop class object

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

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

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

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

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

tit*_*ito 6

老班风:

class BaseClass:
    def m1(self):
        return 1

class MyClass(BaseClass):
    def m1(self):
        return BaseClass.m1(self)
Run Code Online (Sandbox Code Playgroud)

新课堂风格:

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

class MyClass(BaseClass):
    def m1(self):
        return super(MyClass, self).m1()
Run Code Online (Sandbox Code Playgroud)

使用新类样式有很多可能性,例如:

  • super(classname, ...).method()而不是parentclassname.method(...).父方法现在由MRO确定(之前,由您确定).
  • __slots__ 是一个新功能,可以防止在对象中添加dict()并仅为该属性分配内存 __slots__
  • python属性(@property,property()...)仅适用于新类样式.

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

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

而新的是C3,更复杂,但处理前一个没有正确处理的各种情况(查看python邮件列表上的Samuele Pedroni帖子).