The History of Python

2010年6月22日星期二

New-style Classes

新类

英文原文链接: http://python-history.blogspot.com/2010/06/new-style-classes.html

原文作者: Guido van Rossum

[漫长的间歇,本系列blog回归了!我将接着去年的写,我尽量加快速度。]

前面我提到Python中对类(Class)的支持是后来添加的。具体实现符合典型的Python式“抄近路”哲学(cut corners),然而随着Python的发展,类(Class)的实现暴露出各种问题,也成为了Python高级用户的热门话题。

类(Class)实现问题之一是限制了对内置类型(built-in types)的子类化(subclass),例如lists, dictionaries, strings和其它一些对象(object)成为无法子类化的“特殊”类型。对于一门“面向对象(object oriented)”语言来说,这种限制多少有些尴尬。

另一问题是整个类型系统(type system)对于用户自定义类(user defined classes)来说是“错”的。假如你创建两个对象a和b,即使a和b是毫无关联的两个类的实例,语句type(a) == type(b)的值仍为真。无须讳言,对于熟悉C++或者Java语言的程序员来说,由于C++和Java等语言中类(Class)与底层的类型系统(type system)紧密相连,该现象相当诡异。

在Python的2.2版本,我重写了类实现,而且是“正确的实现”。这次重写一个Python主要子系统是目前为止最为野心勃勃的变动,肯定会有人因此说我得了“第二系统综合症(second-system syndrome)”。这次重写,不仅解决了内置类型的子类化这一直接问题,我还增加了对真正的元类(metaclass)的支持,并尝试改善原来多重继承(multiple inheritance)时过于简陋的方法解析顺序(method resolution order)。这项工作的主要受Ira Forman和Scott Danforth撰写的《Putting Metaclasses to Work》影响,书中阐明了元类的概念,及其与Smalltalk中类似概念的区别。

这次重写类实现的一个特点是,新类(new-style class)是作为语言的一个新特性引入,而不是完全替换掉旧的类。实际上为了保持向后兼容,Python 2中缺省生成的类仍然是旧的类。要创建一个新类,你只需子类化一个现存的新类,例如object(object是新类类层次的根)。例如:


class A(object):
statements
...


这次新类的引入取得的成绩斐然。新的元类得到了框架实现者的积极支持,实际上由于例外情况变少也使得讲解类更为容易。向后兼容使得新类进化过程中旧类依然正常工作。最后,虽然旧类终将从语言中移除,用户已习惯了用"class MyClass(object)"来声明一个类,也不错。
--
cut corners可参考前期博文:英文中文译文

second-system syndrome可参考:http://en.wikipedia.org/wiki/Second-system_effect

没有评论: