2006年12月6日星期三

Python类和对象

对象可以使用普通的 属于 对象的变量存储数据。属于一个对象或类的变量被称为
*域*。对象也可以使用 属于 类的函数来具有功能。这样的函数被称为类的*方法
*。这些术语帮助我们把它们与孤立的函数和变量区分开来。域和方法可以合称为
类的*属性*。

域有两种类型――属于每个实例/类的对象或属于类本身。它们分别被称为*实例变量
*和*类变量*。

类使用|class|关键字创建。类的域和方法被列在一个缩进块中。

类的方法与普通的函数只有一个特别的区别――它们必须有一个额外的第一个参数名
称,但是在调用这个方法的时候你*不*为这个参数赋值,Python会提供这个值。这
个特别的变量指对象本身,按照惯例它的名称是|self|。

虽然你可以给这个参数任何名称,但是 强烈建议 你使用|self|这个名称――其他名
称都是不赞成你使用的。使用一个标准的名称有很多优点――你的程序读者可以迅速
识别它,如果使用|self|的话,还有些IDE(集成开发环境)也可以帮助你。

给C++/Java/C#程序员的注释
Python中的|self|等价于C++中的|self|指针和Java、C#中的|this|参考。

|__init__|方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对
象做一些你希望的 初始化 。

给C++/Java/C#程序员的注释
|__init__|方法类似于C++、C#和Java中的 constructor 。

记住,你*只*能使用|self|变量来参考同一个对象的变量和方法。这被称为 属性
参考 。

当对象不再被使用时,|__del__|方法运行,但是很难保证这个方法究竟在 什么时
候 运行。如果你想要指明它的运行,你就得使用|del|语句,就如同我们在以前的
例子中使用的那样。

给C++/Java/C#程序员的注释
Python中所有的类成员(包括数据成员)都是 公共的 ,所有的方法都是 有效的 。
只有一个例外:如果你使用的数据成员名称以 双下划线前缀 比如
|__privatevar|,Python 的名称管理体系会有效地把它作为私有变量。
这样就有一个惯例,如果某个变量只想在类或对象中使用,就应该以单下划线前
缀。而其他的名称都将作为公共的,可以被其他类/对象使用。记住这只是一个惯
例,并不是Python所要求的(与双下划线前缀不同)。
同样,注意|__del__|方法与 destructor 的概念类似。

一个子类型在任何需要父类型的场合可以被替换成父类型,即对象可以被视作是父
类的实例,这种现象被称为*多态现象*。

另外,我们会发现在 重用 父类的代码的时候,我们无需在不同的类中重复它。而
如果我们使用独立的类的话,我们就不得不这么做了。

|SchoolMember|类被称为 基本类 或 超类 。而|Teacher|和|Student|类被称为
导出类 或 子类 。

为了使用继承,我们把基本类的名称作为一个元组跟在定义类时的类名称之后。然
后,我们注意到基本类的|__init__|方法专门使用|self|变量调用,这样我们就可
以初始化对象的基本类部分。这一点十分重要――Python不会自动调用基本类的
constructor,你得亲自专门调用它。

一个术语的注释――如果在继承元组中列了一个以上的类,那么它就被称作 多重继承 。

没有评论: