组合与派生

一个类被定义后,目标就是要把它当成一个模块来使用,并把这些对象嵌入到你的代码中去,同其它数据类型及逻辑执行流混合使用。有两种方法可以在你的代码中利用类。第一种是组合(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__
>>>

 

 

posted on 2014-04-24 14:02  kramer  阅读(434)  评论(0编辑  收藏  举报

导航