class一个更实际的例子

到目前为止,我们所看的大多数例子都是人为创造而且是独立完备的,其目的是为了帮助你把注意力集中在基础知识上。然而,本章的结尾是一个较大的例子,把我们所学的大多数概念都聚合在这里。这个例子几乎是需要自行研究的练习题:试着看这个例子的程序代码,来了解方法调用是如何解析的。

简而言之,下列模块person.Py定义了三个类:

  • GeneriCOisplay是混合类,提供了通用的__str__方法.对任何继承了它的类来说,这个方法会返回字符串,给出创建该实例的类的名称,以及实例内每个属性的“name=valu扩对。它使用dict属性命名空间字典替代了类实例中每个属性创建的“name=valu矿配对列表,并且使用实例内置的class中的内置__name__来确认类的名称.因为print语句会触发_str__,这个类的结果,会替这个类所衍生的所有实例都显示这个专有化打印格式。这是通用的工具。
  • person会记录人们的一般信.息,提供两个处理方法来使用并修改实例对象的状态信息。此外,也会从其超类继承专有的打印格式逻辑。人物对象有两个属性和两个由这个类管理的方法。
  • Employee是对person定制的类,继承了读取姓氏和专有的打印格式方法。但是也增加了一个方法来实现加薪,并重新定义生日运算从而进行了定制(显然,员工要比其他人都老得快)。注意:超类构造方法如何手动启用的。我们需要执行上层的超类版本,来添加名字和年龄。

当你研究这个模块的代码时,你会看见每个实例都有自己的状态信.息。注意继承是如何应用于混合并对行为定进行制,以及运算符重载是如何用于对实例进行初始化和打印实例的。
要测试此程序代码时,我们可以在交互模式下导入这个模块并创建实例。例如,下面是对Person类的运用。建立实例时会触发__init__,接着调用一些方法,来使用或修改实例状态(属性),并在打印实例时,运行继承的的Str从而打印了所有的属性。
最后,下面是文件自我mll试逻辑(位于最后的代码,就用__name__测试下面的代码)的输出,它创建一个人物和一个员工,并对其进行修改。就像往常一样,当文件以顶层脚本执行时,这个自我测试程序代码才会运行,当作为库模块导入时则不会。注意员工是如何继承打印格式和姓氏提取的,有更多的状态信息,还有另一个方法用来加薪,而且可以执行专有化版本的生日方法(过生日老两岁)。

跟踪这个例子中的代码,从而了解这些输出所反映的方法调用。这个例子涵盖了Python
中00P机制的大多数概念。

现在,已经了解了Python类,可能意识到,这里所用的类几乎就像是函数包,嵌套附加在实例上的属性的内置对象,作为状态信息,并对其进行管理。例如,当lastName方法切割并进行索引运算时,只是在对类所管理的对象进行内置的字符串和列表处理运算。运算符重载和继承(在类树中自动查找属性)是蓝图中主要的00P工具。最后,这可以让类树底端的Employee获得得不少“免费”的行为,而这也是OOP内含主要概念。

#!/usr/bin/env python
# -*- coding:utf-8 -*- class GenericDisplay:
def gatherAttrs(self):
attrs = "\n"
for key in self.__dict__:
attrs += '\t%s=%s\n' % (key, self.__dict__[key])
return attrs
def __str__(self):
return '<%s: %s>' % (self.__class__.__name__, self.gatherAttrs()) class Person(GenericDisplay):
def __init__(self, name, age):
self.name = name
self.age = age
def lastName(self):
return self.name.split()[-1]
def birthDay(self):
self.age += 1 class Employee(Person):
def __init__(self, name, age, job=None, pay=0):
Person.__init__(self, name, age)
self.job = job
self.pay = pay
def birthDay(self):
self.age += 2
def giveRaise(self, percent):
self.pay *= (1.0 + percent) if __name__ == '__main__':
bob = Person('Bob Smith', 40)
print(bob)
print("--------------------------------")
print(bob.lastName())
bob.birthDay()
print(bob)
print("--------------------------------")
sue = Employee('Sue jones', 44, job='dev', pay=100000)
print(sue)
print(sue.lastName())
sue.giveRaise(0.10)
print(sue)

运行结果:

<Person:
name=Bob Smith
age=40
>
--------------------------------
Smith
<Person:
name=Bob Smith
age=41
>
--------------------------------
<Employee:
name=Sue jones
age=44
job=dev
pay=100000
>
jones
<Employee:
name=Sue jones
age=44
job=dev
pay=110000.00000000001
>
05-29 01:25