Python: 旧式(经典)和新式对象的方法解析顺序
我在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邮件列表上的帖子)。