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在捉老鼠

posted on 2020-01-04 18:08  InnoLeo  阅读(289)  评论(0编辑  收藏  举报