Day19 python 多继承、继承、菱形继承、多态

1.继承

继承 : 一个类除了拥有自身的属性方法之外,还拥有另外一个类的属性和方法
继承: 1.单继承 2.多继承
子类:一个类继承了另外一个类,那么这个类是子类,(衍生类)
父类:一个类继承了另外一个类,被继承的那个类是父类 (超类,基类)
object 是所有的类的父类

 例:

class Human():
    def eat(self):
        print("远古人类打猎,吃猎物")
        
    def sleep(self):
        print("远古人类吃饱了就睡觉")
        
    def __beat_doudou(self):
        print("远古人类起来先打豆豆,在打猎")

# 把要继承的类放到class 定义类的这个括号里面写

1.1(1) 子类可以调用父类的公有成员(方法,属性)

class Man(Human):
    pass
# 实例化对象
obj  = Man()
obj.eat()
运行结果:

1.2(2) 子类不可以调用父类私有成员(方法,属性)

class Woman(Human):
    def myskill(self):
        # 调用父类公有方法
        self.eat()
        # 不能够在子类里面调用父类私有方法
        # self.__beat_doudou()
    
obj = Woman()
# obj.__beat_doudou() 私有的没法再类外调用
obj.myskill()
代码执行结果:

1.3(3) 子类可以改造父类的公有方法

子父继承之后,如果调用的成员,
子类里面有,优先调用子类的
子类里面没有,就调用父类
class Children(Human):
    # 对eat方法进行改写
    def eat(self):
        print("小孩下生只会喝奶奶")
        
obj = Children()
obj.eat()
运行结果:

2.多继承

2.1基本用法

#(1) 基本语法
class Father():
    f_property = "风流倜傥,英俊潇洒"
    def f_hobby(self):
        print("吃喝嫖赌抽,坑蒙拐骗偷,喜欢烫头")
        
class Mother():
    m_property = "沉鱼落雁,闭月羞花"
    def m_hobby(self):
        print("打麻将,跳广场舞,喜欢买名牌包包")
        
# 多继承:在括号里面用逗号,把多个父类隔开
class Daughter(Father,Mother):
    pass

obj = Daughter()
print(obj.f_property)
obj.m_hobby()

运行结果:

 2.2调用父类

注意点:
(1)super本身是一个类 super()是一个对象 用于调用父类的绑定方法
(2)super() 只应用在绑定方法中,默认自动传递self对象 (前提:super所在作用域存在self)
(3)super用途: 解决复杂的多继承调用顺序

 例:

 
 
class Father():
    f_property = "风流倜傥,英俊潇洒"
    def f_hobby():
        print("吃喝嫖赌抽,坑蒙拐骗偷,喜欢烫头")
        
class Mother():
    m_property = "沉鱼落雁,闭月羞花"
    def m_hobby(self):
        print("打麻将,跳广场舞,喜欢买名牌包包")
class Son(Father,Mother):
    # f_property = "子类的属性f_property"
    # (1)通过类的方式调用父类的相关成员
    def skill1(self):
        # 调用Father中的f_hobby
        Father.f_hobby()
        # 调用Mother中的m_property
        print(Mother.m_property)
        
    # (2)通过对象的方式调用父类的相关成员
    def skill2(self):
        # 调用Father中的f_property
        print(self.f_property)
        # 调用Mother中的m_hobby
        self.m_hobby()
        
    # (3)使用super调用父类的相关成员
    def skill3(self):
        # 调用Father中的f_property
        # super() 一定调用的是父类的,区别于self.
        # print(super().f_property) #风流倜傥
        # super().f_hobby() error  super()调用的是绑定方法,默认传递self参数
        # 调用Mother中的m_hobby
        super().m_hobby()
        
print("<====>")
obj = Son()
# obj.skill1() #吃喝嫖赌抽,坑蒙拐骗偷,喜欢烫头   沉鱼落雁,闭月羞花''
# obj.skill2()
obj.skill3()

'''
self 在子类存在这个成员的时候,调用自己的
子类不存在这个成员的时候,调用父类的
而super,是一定只调用父类的公有成员属性,和公有绑定方法.
'''
运行结果:

 3.菱形继承

    Human
    
Man       Woman    

   Children
class Human():
    pty = 111
    def feelT(self):
        print("远古人类天热了,脱毛1")
        print(self.pty)
        print("远古人类天冷了,长毛2")
    
class Man(Human):
    pty = 222
    def feelT(self):
        print("现代男性天热了,开空调3")
        super().feelT()
        print("现代男性天冷了,也开空调4")
    
class Woman(Human):
    pty = 333
    def feelT(self):
        print("现代女性天热了,穿比基尼5")
        super().feelT()
        print("现代女性天冷了,也穿比基尼,要风度,不要温度6")
    
class Children(Man,Woman):
    pty = 444
    def feelT(self):
        print("小孩天热了,他就吃冰棍哭7")
        super().feelT()
        print("小孩天冷了,他就吃奶奶哭8")

obj = Children()
obj.feelT()

运行结果为:
 注意:上面这种继承方式即是广度优先,在python开始的版本的时候是采用的深度优先调用。
# mro列表 :通过c3算法,把所有的继承关系按照列表的顺序呈现.
# 语法:
类.mro() => 继承顺序列表
[
<class '__main__.Children'>, 
<class '__main__.Man'>, 
<class '__main__.Woman'>, 
<class '__main__.Human'>, 
<class 'object'>
]
super 就是默认按照mro列表的顺序,依次调用
用于解决多继承调用顺序混乱的问题
'''
lst = Children.mro()
print(lst)
# 判断是否是子父关系 [有血缘关系即可] issubclass
res = issubclass(Children,Man)
print(res)
res = issubclass(Children,Human)
print(res)
# 满足一个条件,即返回真
res = issubclass(Children,(Man,Woman))
print(res)


# 判断对象的类型 [有血缘关系即可] isinstance
res = isinstance(obj,Children)
print(res)
res = isinstance(obj,Man)
print(res)
res = isinstance(obj,(Human,Woman))
print(res)
运行结果:

 4. 多态

不同的子类对象,调用相同的父类方法,产生不同的执行结果
特征: 继承 重写
好处: 在不改变代码的前提下,实现代码的复用,和不同的效果.
 例:
# 陆军
class Army(Soldier):
    def attack(self):
        print("[陆军]开坦克以迅雷不及掩耳之势占领敌方的高地")
    def back(self):
        print("[陆军]学会了忍者的招数,瞬间逼出闪现")
    
# 海军
class Navy(Soldier):
    def attack(self):
        print("[海军]用鱼雷轰炸敌方的潜水艇和夹板")
    def back(self):
        print("[海军]立即跳海,下海喂鱼")
    
# 空军
class Airforce(Soldier):
    def attack(self):
        print("[空军]把二营长的那个意大利炮给我端上来,我要突突他")
    def back(self):
        print("[空军]弃机跳伞,落地成盒")


# 实例化各个兵种,各就位准备
obj_army = Army()
obj_navy = Navy()
obj_airforce = Airforce()
lst = [obj_army,obj_navy,obj_airforce]

# 等待将军下达命令
# 按照下面的执行命令就行编写程序:
##思路 思路 思路 strvar = """ 你好将军,下面是您的操作按钮; 1.全体攻击 2.全体撤退 3.陆军出击,其他人撤退 4.退出程序 """ sign = True while sign: print(strvar) num = input("将军请下令:") for i in lst: if num == "1": i.attack() elif num == "2": i.back() elif num == "3": if isinstance(i,Army): i.attack() else: i.back() elif num.upper() == "Q": sign = False break else: print("风太大,我听不到") break
注:如果在循环里面套有循环的话,想退出内层循环的时候,即是退出外层循环
注意使用中间变量sign
 
  
 
 

猜你喜欢

转载自www.cnblogs.com/longerandergou/p/10908564.html