组合与派生
一个类被定义后,目标就是要把它当成一个模块来使用,并把这些对象嵌入到你的代码中去,同其它数据类型及逻辑执行流混合使用。有两种方法可以在你的代码中利用类。第一种是组合(composition)。就是让不同的类混合并加入到其它类中,来增加功能和代码重用性。 另一种方法是派生。我们先来看组合。
举例来说,比如我们想设计一个AddrBookEntry 的 class。在设计的过程中我们先设计了 Name class 和 Phone class 。 那么我们在设计 AddrBookEntry的过程中就可以直接把Name和Phone加入到AddrBookEntry中,而不必写一个全新的AddrBookEntry。
>>> class Name: ... def __init__(self,nm): ... self.name=nm ... >>> class Phone: ... def __init__(self,num): ... self.num=num ... >>> class AddrBookEntry: ... def __init__(self,nm='null',ph='null'): ... self.name=Name(nm) ... self.phone=Phone(ph) ... >>> >>> abe1=AddrBookEntry('kramer',12345678) >>> abe2=AddrBookEntry() >>> abe1.name.name 'kramer' >>> abe1.phone.num 12345678 >>> abe2.name.name 'null' >>> abe2.name.name 'null'
再看派生。 当类之间有显著的不同,并且(较小的类)是较大的类所需要的组件时,组合表现得很好,但当你设计“相同的类但有一些不同的功能”时,派生就是一个更加合理的选择了
比如我们上面的例子中设计了一个AddrBookEntry 类。 如果我们还想设计一个EmpAddrBookEntry。 里面存储的信息更偏重于工作信息比如部门,工号等。而又想设计一个PersonalAddrBookEntry 里面存储的信息更多是关于私人比如家庭住址等等。那么我们就可以从 addrBookEntry来派生子类。
创建子类的语法非常简单如下:
class SubClassName (ParentClass1[, ParentClass2, ...]): class_suite
经典类的语法与新式类不同之处就在于前者没有从任何祖先派生:
class ClassicClassWithoutSuperclasses: class_suite
派生的目的是从父类派生出子类,子类会拥有父类的所有属性,不管是数据还是方法。 不过 其实这样说法有点武断,因为有个属性__doc__不可以被子类集成。我们通过下面的代码来看一下:
>>> class P: ... 'this is class P, classic class' ... def __init__(self): ... print 'this is an instance of ', self.__class__.__name__ ... >>> class C(P): ... pass ... >>> p=P() this is an instance of P >>> c=C() this is an instance of C >>> p.__doc__ 'this is class P, classic class' >>> c.__doc__ >>>