一个类除了自身所拥有的属性方法之外,还获取了另外一个类的成员属性和方法 是一种继承关系
被继承的类叫做父类(基类,超类),继承的类叫做子类(衍生类)
在python中所有类都继承object这个父类
继承: (1) 单继承 (2) 多继承
多继承的弊端会造成菱形继承这种情况,找不清调用顺序
super对象按照mro列表的顺序依次调用,解决菱形继承存在的问题
经典类:深度优先 (python2.x)
新式类:广度优先 (python3.x)
写多继承时,尽量避免造成不同类相同方法名的情况,提高代码质量 高内聚,低耦合
高内聚:一个模块只完成一个任务,专一性高
低耦合:模块与模块之间可以彼此独立不冲突,方便移植复用.
(1)super本身是一个类 super()是一个对象 用于调用父类的绑定方法
(2)super() 只应用在绑定方法中,默认自动传递self对象 (前提:super所在作用域存在self)
(3)super用途: 解决复杂的多继承调用顺序
class Human(object): eye = "黑色的" def jump(self): print("古代人类都能上树") def beat_animal(self): print("古代人类都会打猎") def __makefire(self): print("古代人类会生火") # (1) 子父继承之后,子类可以调用父类的公有成员 class Man(Human): pass obj = Man() obj.jump() # (2) 子父继承之后,子类不能调用父类的私有成员 class Woman(Human): def pub_func(self): self.__makefire() obj2 = Woman() # obj2.__makefire() 不行 # obj2.pub_func() 不行 # (3) 子父继承之后,子类可以重写父类的同名公有方法 class Children(Human): def beat_animal(self): print("小孩天生只会打豆豆,不会打猎") obj3 = Children() obj3.beat_animal()View Code
# (1) 基本语法 class Father(): property = "风流倜傥,才华横溢,玉树临风,才高八斗,学富五车,英姿洒窗" def f_hobby(self): print("吃喝嫖赌抽,坑蒙拐骗偷,抽烟喝酒烫头") class Mother(): property = "倾国倾城,貌美如花,沉鱼落雁,闭月羞花,婀娜多姿,前凸后翘" def m_hobby(self): print("蹦野迪,社会摇,打麻将,网红勾引小鲜肉") class Daughter(Father,Mother): pass obj = Daughter() print(obj.property) obj.m_hobby() # (2) 多继承的成员调用 print("<=================>") class Father(): property = "风流倜傥,才华横溢,玉树临风,才高八斗,学富五车,英姿洒窗" def f_hobby(): print("吃喝嫖赌抽,坑蒙拐骗偷,抽烟喝酒烫头") class Mother(): property = "倾国倾城,貌美如花,沉鱼落雁,闭月羞花,婀娜多姿,前凸后翘" def m_hobby(self): print(self.property) print("蹦野迪,社会摇,打麻将,网红勾引小鲜肉") """ (1)super本身是一个类 super()是一个对象 用于调用父类的绑定方法 (2)super() 只应用在绑定方法中,默认自动传递self对象 (前提:super所在作用域存在self) (3)super用途: 解决复杂的多继承调用顺序 """ class Son(Father,Mother): property = "打游戏,吃小零食" def m_hobby(self): print("son中m_hobby方法") # 用类调用成员 def skill1(self): Father.f_hobby() print(Mother.property) # 用对象调用成员 """self按照顺序找: 对象本身 => 类 => 父类 对应的成员 """ def skill2(self): print(self.property) self.m_hobby() # 用super调用成员 """super()只调用父类的相关成员,顺带传递对象参数""" def skill3(self): print(super()) print(super().property) super().m_hobby() obj2 = Son() # obj2.skill1() obj2.property = "喜欢看lol,dnf,wow,跑跑卡丁车,ddo,霸王大陆,澄海3c" # obj2.skill2() obj2.skill3()View Code
Human
Man Woman
Children
class MyClass(): pass class Human(): pty = 1 def feelT(self): print("古代人类,天热了,光腚1") print(self.pty) print("古代人类,天冷了,穿寿衣2") class Man(Human): # pty = 2 def feelT(self): print("男人,天热了,光膀子3") print(super(),"<==2==>") super().feelT() print("男人,天冷了,光腚4") class Woman(Human): # pty = 3 def feelT(self): print("女人,天热了,脱毛5") print(super(),"<==3==>") super().feelT() print("女人,天冷了,穿貂6") class Children(Man,Woman): # pty = 4 def feelT(self): print("小孩,天热了,光腚7") print(super(),"<==1==>") super().feelT() print("小孩,天冷了,多喝热水8") # ### super的深层理解 obj = Children() obj.feelT() # 73512648 """ # mro: 方法解析顺序 (c3算法计算的) # 语法: 类.mro() => 列表 m :method r :resolution o :order super 会自动根据mro列表返回出来的顺序关系,依次调用 super作用:专门用于解决复杂的多继承调用顺序关系;依照mro返回的列表顺序,依次调用; super调用的顺序:会按照c3算法的广度优先原则进行调用 super传参:会默认在调用方法时,传递该对象参数; """ lst = Children.mro() print(lst) """ [ <class '__main__.Children'>, <class '__main__.Man'>, <class '__main__.Woman'>, <class '__main__.Human'>, <class 'object'> ] """ # ### issubclass与isinstance # issubclass 判断类的子父关系(应用在类与类之间) """只要在一条继承链上满足关系即可""" res = issubclass(Children,Man) res = issubclass(Children,Human) res = issubclass(Children,MyClass) # 如果元组当中有一个父类满足,即返回真 res = issubclass(Children, (Man,Human,MyClass) ) print(res) # isinstance 判断对象的类型 (应用在类与对象之间) """只要在一条继承链上满足关系即可""" res = isinstance(obj,Children) res = isinstance(obj,Human) res = isinstance(obj,MyClass) # 如果元组当中有一个类满足,即返回真 res = isinstance(obj, (Man,Human,MyClass) ) print(res)View Code
super的调用顺序
super调用
经典2.x_深度优先
菱形继承
新式类3.x_广度优先