继承补遗
# 继承中的查找顺序 # 经典类: 深度优先 # 新式类: 广度优先 # mro方法 # 只能新式类中使用,通过类名调用-->生成继承顺序的列表 # # super()方法 : 按照mro列表顺序,从定义位置找到(调用super()类)的上一层类.而不是调用父类的方法 """如例:Foo没有父类但是依旧可以调用super()""" class Foo: def f1(self): print('foo f1') super().f2() class Bar: def f2(self): print('bar f2') class Baz(Foo,Bar): pass baz = Baz() print(Baz.mro()) baz.f1() baz.f2()
组合
# 组合 # 当类中的属性包含其他的即 HAS-A 关系时,将类作为另一种类的属性,--> 组合 # 为什么 # 减少代码量,增强可拓展性,加强可概括性 # 例 '''方案一: 在对象层次产生联系''' class Class: def __init__(self,grade,course): self.grade = grade self.course = course def get_class(self): return (self.grade,self.course) class Member: def __init__(self): school = 'oldboy' def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex class Teacher(Member): def __init__(self,name,age,sex,): super().__init__(name,age,sex,) def teach(self): pass cla_0 = Class(15,'linux') cla_1 = Class(15,'化学') tae_0 = Teacher('llk',24,'male') tae_1 = Teacher('egon',24,'male') tae_0.Class = cla_0 print(tae_0.Class.grade) tae_1.Class = cla_1 print(tae_1.Class.get_class()) """方案二 : 在定义类时就将需要组合的类联系在一起,在类层面产生联系""" class Member: def __init__(self): school = 'oldboy' def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex class Teacher(Member): def __init__(self,name,age,sex,Class): super().__init__(name,age,sex) self.Class = Class def get_class(self): return self.Class.get_class() def teach(self): pass class Student(Member): def __init__(self,name,age,sex,Class): super().__init__(name,age,sex) self.Class = Class def get_stu_class(self): return Class.get_class() def stude(self): pass class Class: def __init__(self,grade,course): self.grade = grade self.course = course def get_class(self): return (self.grade,self.course) cla_0 = Class(15,'linux') cla_1 = Class(15,'化学') tea_0 = Teacher('llk',24,'male',cla_0) tea_1 = Teacher('egon',24,'male',cla_1) print(tea_0.get_class()) print(tea_1.get_class()) # 小错误总结 # 1 调用super()方法时一定要带小括号 # 2 不要忘记向super().__init(name,age,sex)传入相应参数 # 3 组合时调用类属性时,一定不要忘记带self.Class,定义时也一定带这self
抽象
# 接口 --> 是什么 # C# 语言参考 # 接口(C# 参考) # 定义:接口是一种约束形式,其中只包括成员定义,不包含成员实现的内容。 # 目的:接口的主要目的是为不相关的类提供通用的处理服务,由于C#中只允许树形结构中的单继承,即一个类只能继承一个父类,所以接口是让一个类具有两个以上基类的唯一方式。 [2] # 接口只包含方法、属性、索引器和事件的签名。方法的实现是在实现接口的类中完成的 # ps:在python中没接口类型所以 --> 衍生出 抽象类来实现接口的功能 # 抽象类 --> 接口 """具体实现""" import abc class Hero(metaclass=abc.ABCMeta): @abc.abstractmethod def attack(self): pass @abc.abstractmethod def skill_q(self): pass @abc.abstractmethod def skill_w(self): pass @abc.abstractmethod def skill_e(self): pass @abc.abstractmethod def skill_r(self): pass class Reven(Hero): def adad(self): print('adad') llk = Reven() llk.adad() # ps: 必须调用才可以发现是否符合抽象类