zoukankan      html  css  js  c++  java
  • 组合与派生

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

     

  • 相关阅读:
    Oracle PLSQL Demo
    Oracle PLSQL Demo
    Oracle PLSQL Demo
    Oracle PLSQL Demo
    Apache Commons Lang的StringUtils.isEmpty(STR)和StringUtils.isBlank(STR)
    随记MySQL的时间差函数(TIMESTAMPDIFF、DATEDIFF)、日期转换计算函数(date_add、day、date_format、str_to_date)
    jquery,checkbox无法用attr()二次勾选
    随笔记:如何使用Python连接(/操作)Oracle数据库(Windows平台下)
    MySQL获取随机数
    Python的模块调用
  • 原文地址:https://www.cnblogs.com/kramer/p/3685373.html
Copyright © 2011-2022 走看看