2.18 类
是面向对象编程的核心,它扮演相关数据及逻辑容器的角色。它们提供了创建“真实”对象(也就是实例)的蓝图。因为Python并不强求你以面向对象的方式编程(与Java不同),此刻你也可以不学习类。不过我们还是在这儿放了些例子,以方便感兴趣的读者浏览。
如何定义类
使用class关键字定义类。可以提供一个可选的父类或者说基类;如果没有合适的基类,那就使用 object作为基类。class行之后是可选的文档字符串、静态成员定义及方法定义。
在上面这个类中,我们定义了一个静态变量version,它将被所有实例及4个方法共享——init(). showname()、showver()及熟悉的addMe2Me()。这些show*()方法并没有做什么有用的事情,仅仅输出对应的信息。init()方法有一个特殊名字,所有名字开始和结束都有两个下划线的方法都是特殊方法。
当一个类实例被创建时,init()方法会自动执行,在类实例创建完毕后执行,类似构造器。init()可以被当成构造器,不过不像其他语言中的构造器,它并不创建实例——它仅仅是你的对象创建后执行的第一个方法。它的目的是执行一些该对象的必要的初始化工作。通过创建自己的init()方法,你可以覆盖默认的init()方法(默认的方法什么也不做),从而能够修饰刚刚创建的对象。在这个例子里,我们初始化了一个名为name的类实例属性(或者说成员)。这个变量仅在类实例中存在,它并不是实际类本身的一部分。init()需要一个默认的参数,前一节中曾经介绍过。毫无疑问,你也注意到每个方法都有的一个参数,self。
什么是self?它是类实例自身的引用。其他面向对象语言通常使用一个名为this的标识符。
如何创建类实例
屏幕上显示的字符串正是自动调用init()方法的结果。当一个实例被创建,init()就会被自动调用,不管这个init()是自定义的还是默认的。
创建一个类实例就像调用一个函数,它们确实拥有一样的语法,它们都是可调用对象。类实例使用同样的函数操作符调用一个函数或方法。既然我们成功创建了第一个类实例,那现在来进行一些方法调用。
每个方法的调用都返回我们期望的结果。比较有趣的数据是类名字。在showname()方法中,我们显示self.class.name变量的值。对一个实例来说,这个变量表示实例化它的类的名字(self.class引用实际的类)。在我们的例子里,创建类实例时我们并未传递名字参数,因此默认参数‘John Doe’就被自动使用。在我们下一个例子里,我们将指定一个参数。
第13章将详细介绍Python类和类实例。