2、面向对象之继承
继承:一个类除了自身所拥有的属性方法之外,还获取了另外一个类的成员属性和方法
一个类继承另一个类,那么该类就是子类(衍生类),被继承的这个叫做父类(基类,超类)
继承的3种形式:单继承、多继承、菱形继承
注:python中所有类都默认继承object类(python3.X版本,python2.X则不会默认继承object类)
单继承
一个子类只继承一个父类
继承的特点(子类继承父类)
(1)子类可以调用父类所有的公有成员
(2)子类不可以调用父类的私有成员
(3)子类可以重写父类的同名方法
调用优先级(子类继承父类)
如果子类里面有该成员属性方法,优先调用自己的
如果没有该成员,name调用父类的公有成员
如果都没有,直接报错
class Human(object):
hair = "金色"
sex = "男"
def eat(self):
print("人类的天性吃吃吃")
def la(self):
print('人类天生就需要lalala')
def __makebaby(self):
print("人类天生就能繁衍后代")
# 继承
class Man(Human):
pass
obj = Man()
print(obj.hair)
class WoMan(Human):
def pub_makbaby(self):
self.__makebaby()
obj = WoMan()
obj.eat()
# 方法重写
class Children(Human):
sex = "女性"
def eat(self):
print("小孩出生只能喝奶")
obj = Children()
print(obj.sex)
obj.eat()
多继承
一个子类继承多个父类
super用法
(1)super本身是一个类,super()是一个对象,用于调用父类的绑定方法
(2)super()只应用在绑定方法中,默认自动传递self对象(前提:super所在作用域存在self)
(3)super作用:解决复杂的多继承调用顺序
super调用父类的相关公有成员,不会调用自己类中的成员,父类若没有,报错
注:super和self不同,super只调用父类
# 多继承
class Father:
property = "玉树临风,风流倜傥,一枝梨花压海棠"
def f_hobby(self):
print("吃喝嫖赌抽,坑蒙拐骗偷,抽烟喝酒烫头")
class Mother:
property = "闭月羞花,沉鱼落雁,一只红杏出墙来"
def m_hobby(self):
print("打麻将,敷面膜,跳广场舞")
class Daughter(Mother, Father):
pass
obj = Daughter()
print(obj.property)
obj.m_hobby()
class Father:
property = "玉树临风,风流倜傥,一枝梨花压海棠"
def f_hobby():
print("吃喝嫖赌抽,坑蒙拐骗偷,抽烟喝酒烫头")
class Mother:
property = "闭月羞花,沉鱼落雁,一只红杏出墙来"
def m_hobby(self):
print("打麻将,敷面膜,跳广场舞")
class Son(Father, Mother):
property = "打游戏,比如lol,wow,dota2"
# 使用类调用父类成员
def skill1(self):
print(Mother.property)
Father.f_hobby()
# 使用对象调用父类成员
def skill2(self):
self.m_hobby()
print(self.property)
def skill3(self):
print(super())
print(super().property)
super().m_hobby()
obj = Son()
obj.skill1()
obj.skill2()
print('<===>')
obj.skill3()
菱形继承
菱形继承:两个子类继承同一个父类,而又有子类同时继承两个父类
mro列表:super用途的体现,解决复杂的多继承调用顺序
类.mro返回的是方法调用顺序的列表,针对于多继承下的同名方法,按照列表的顺序依次调用
issubclass:判断是否存在子父关系(使用方法和isinstance的使用一模一样),在同一继承链中即可
isinstance:判断类型,在同一继承链中即可
class BigMan():
pass
class Human():
pty = 4
def feelT(self):
print("原始人类天热了,让后裔把太阳射下来1")
print(self.pty)
print("原始人类天冷了,让女娲补天,防止漏风2")
class Man(Human):
pyt = 3
def feelT(self):
print("现代男人天热了,吹空调3")
super().feelT()
print("现代男人天冷了,吹暖气4")
class Woman(Human):
pty = 2
def feelT(self):
print("现代女人天热了,洗洗澡5")
super().feelT()
print("现代男人天冷了,吃雪糕6")
class Children(Man, Woman):
pty = 1
def feelT(self):
print("现代小朋友天热了,洗海澡7")
super().feelT()
print("现代小朋友天冷了,钻被窝8")
obj = Children()
obj.feelT()
# mro
lst = Children.mro()
print(lst)
# issubclass
ret1 = issubclass(Children, Man)
ret2 = issubclass(Children, Woman)
ret3 = issubclass(Children, Human)
ret4 = issubclass(Children, BigMan)
ret = issubclass(Children, (Man, Woman, Human, BigMan))
print(ret1, ret2, ret3, ret4, ret)
# isinstance
ret1 = isinstance(obj, Children)
ret2 = isinstance(obj, Man)
ret3 = isinstance(obj, Human)
ret4 = isinstance(obj, Woman)
ret = isinstance(obj, BigMan)
print(ret1, ret2, ret3, ret4, ret)
print(Children.__dict__)
ret = "feelT" in Children.__dict__
print(ret)