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