• python 类的使用原则


    Class 的继承分类

            单继承链/无重叠的继承链/有重叠的继承链

    class 的继承算法

     深度优先算法:
          1. 把根节点压入栈中
          2.每次从栈中弹出一个元素,搜索所有在它下一级的元素,将这些元素压入栈中,
          3 重复1和2

    C3算法: 公式:
    L(object)=[object]
    L(子类(父类1,.父类2))=[子类]+ merge(L(父类1,.父类2),[父类1,父类2])
    merge算法
    1 第一个列表的第一个元素是后续列表的第一个元素,或者后续列表中没有再次出现,则将这个元素合并到最终的解析列表中,并从当前操作的所有列表中删除
    2. 如果不符合,则跳过此元素,查找下一个列表的第一个元素,重复1的判断规则
    3. 如果最终无法把所有元素归并到解析列表,则报错

     C3算法例子:

    import inspect
    class D:
        pass
    # L(D(object))= [D] + merge(L(object),[object])
    #             = [D]  +merge(L[object],[object])
    #             = [D,object] + merge(L[], [])
    #             = [D, object]
    class B(D):
        pass
    #L(B(object))= [B]+ merge(L(D),[D])
    #            = [B]+ merge([D, object],[D])
    #            = [B]+ merge([D, object],[D])
    #            = [B,D]+ merge(['', object],[''])
    #            = [B,D]+ merge([object])
    #            = [B,D,object]+ merge([])
    #            = [B,D,object]
    class C(D):
        pass
    #L(C(object))= [C,D,object]
    class A(B,C):
        pass
    #L(A)=[A]+merge(L(B),L(C),[B,C])
    #    =[A]+merge([B,D,object],[C,D,object],[B,C])
    #    =[A,B]+merge([D,object],[C,D,object],[C])
    #    =[A,B,C]+merge([D,object],[D,object])
    #    =[A,B,C,D]+merge([object],[object])
    #    =[A,B,C,D,object]
    print(inspect.getmro(A))
    

     结果:

    (<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class 'object'>)

    类的设计原则:

    S: Single responsibility Principle 一个类只负责一项职责

    O:       Open Closed Principle  ,对扩展开发,对修改关闭

    L:   Liskov Substitution principle  里氏替换原则 使用基类引用的地方必须能使用继承类胡对象

    I:         Interface Segregation Principle  如果一个类包含了过多的接口方法,面这些方法在使用过程中并非不可分割,那么应当将他们分离

    D:       Dependency Inversion priciple  依赖倒置原则,高层模块不应该直接依赖底层模块,他们应该依赖抽象类或接口

     1 class Animal:
     2     def __init__(self,name,age=1):
     3         self.name=name
     4         self.age=age
     5 
     6     def eat(self):
     7         print("%s在吃饭"%self)
     8 
     9     def play(self):
    10         print("%s在玩"%self)
    11 
    12     def sleep(self):
    13         print("%s在睡觉"%self)
    14 
    15     def eat(self):
    16         print("%s在吃饭"%self)
    17 
    18 
    19 class Person(Animal):
    20     def __init__(self,name,pets,age=1):
    21         super().__init__(name,age)
    22         self.pets=pets
    23 
    24     def yang_pets(self):
    25         for pet in self.pets:
    26             print("%s在养宠物"%self)
    27             pet.eat()
    28             pet.play()
    29             pet.sleep()
    30 
    31     def make_pets_work(self):
    32         for pet in self.pets:
    33             print("%s在安排工作" %self)
    34             pet.work()
    35 
    36     def __str__(self):
    37         return "小朋友{},年龄是{} 现在".format(self.name, self.age)
    38 
    39 class Cat(Animal):
    40     def work(self):
    41         print("%s在捉老鼠" %self)
    42 
    43     def __str__(self):
    44         return "  宠物名字是{},年龄是{}".format(self.name,self.age)
    45 
    46 
    47 class Dog(Animal):
    48     def work(self):
    49         print("%s在看门" % self)
    50 
    51     def __str__(self):
    52         return "  宠物名字是{},年龄是{}".format(self.name, self.age)
    53 
    54 d=Dog("小黑",18)
    55 c=Cat("小红",2)
    56 p=Person("LH",[d,c],18)
    57 p.yang_pets()
    58 p.make_pets_work()

    结果如下:

    小朋友LH,年龄是18 现在在养宠物
      宠物名字是小黑,年龄是18在吃饭
      宠物名字是小黑,年龄是18在玩
      宠物名字是小黑,年龄是18在睡觉
    小朋友LH,年龄是18 现在在养宠物
      宠物名字是小红,年龄是2在吃饭
      宠物名字是小红,年龄是2在玩
      宠物名字是小红,年龄是2在睡觉
    小朋友LH,年龄是18 现在在安排工作
      宠物名字是小黑,年龄是18在看门
    小朋友LH,年龄是18 现在在安排工作
      宠物名字是小红,年龄是2在捉老鼠

    每天进步一点点,多思考,多总结 版权声明:本文为CNblog博主「zaituzhong」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
  • 相关阅读:
    简单的mvc之一:简单的开始
    从子类化到工厂模式
    js漫谈
    asp.net mvc框架的一些切入点
    js框架漫谈
    基于公司云平台的即时聊天工具PTALK
    基于公司云平台的素材归档系统(一)
    搜索输入框下拉列表热词搜索的实现
    HTML5 localStorage 的使用
    MVC模式下xml文件的解析
  • 原文地址:https://www.cnblogs.com/tingxin/p/12149921.html
Copyright © 2020-2023  润新知