Python3.2官方文档翻译-多重继承和私有变量


6.5.1 多重继承

Python也支持多种继承形式。一个能继承多个基类的类定义如下:

class DerivedClassName(Base1, Base2, Base3):

.

.

.

大多数情况,最简单而言,你可以把从父类继承下来的属性查询看成是遵循深度优先,从左到右。

而不是在同一等级重复的同样类中执行两次。因此,如果一个属性没在派生类中找到,首先会在base1然后再base1的基类中,如果在那里都没发现,就会在base2中查找等等。

事实上,比刚才说的稍微有点复杂。方法执行顺序为了协同调用super()而动态变化。这种方法在一些支持多重继承的语言中因调用接下来方法非常出名。并且要比单继承语言中的super调用更强大。

动态排序是必须的,因为多重继承中所有情况显示至少一个菱形关系。(从最底层的类开始,至少存在一个父类可以通过多条路径访问)。例如,所有的的类继承object, 因此多种继承的每种情况提供至少一种路径到达object. 为了保证至少有一种方法访问基类,动态算法用一种特别方法线性化了搜索顺序。这种方法就是保证在每个类按从左到右的顺序,每个父类只有一次,并且那是不变的。(即继承一个类不会一项它父类的优先级),总之,这些属性让使用多重继承设计可靠的和可扩展的类成为可能。更多信息请参考:

6.6 私有变量

除了对象内部其他都不能访问的“私有”变量在python中是不存在的。但是,大多数python代码都遵守一个规则:以下划线为前缀的名称被看成是API的非公共部分。它可以认为是一个细节实现并且改变时不需通知。

因为存在类私有成员的合法用例(即为了避免在子类定义的名称想冲突),所有存在对这种机制的限制支持。这种机制叫名称变换。_spam形式的任何标识符(至少是两个开头下划线,最多一尾下划线)在书面上可以被_classname_spam代替,这里classname是当前的类名。 只要这种变换出现在类定义中,那么这个不涉及到标识符的语法位置就可以处理。

名字变换对于让子类在不影响父类方法前提下重载方法很有重要意义。例如:


这种变换规则最初设计是为了避免冲突,如果强意要访问或者修改一个被认为私有变量,仍然是可以的。在一些特别的情况下,这种方法更加有用。例如调试器。

注意传给exec()或者eval()的代码不会将调用类作为当前类,这个很global全局变量的效果相似。它的作用限制于一起进行字节码编译的代码。同样的限制也适用于getattr(),settattr()和delattr()函数,以及直接引用_dict_时。

评论关闭