day18-Python运维开发基础(单继承 / 多继承 / 菱形继承、类的多态)

1. 单继承 / 多继承 / 菱形继承

# ### 继承 : 一个类除了自身所拥有的属性方法之外,还获取了另外一个类的成员属性和方法
"""
一个类可以继承另外一个类,那么当前类是子类(衍生类),被继承的类是父类(基类,超类)

python中继承的种类:
    (1) 单继承
    (2) 多继承
    
object 是所有类的父类
"""

# (1) 基本语法
class Human():
    hair = "黑色"
    __age = 18
    
    def eat(self):
        print("远古人类天生吃猎物,烤着吃")
        
    def sleep(self):
        print("远古人类睡觉的时候打呼噜")
        
    def __makebaby(self):
        print("远古人类,一天能造出3个孩子")

# (1) 子父继承之后 , 子类可以调用父类的公有成员
class Man(Human):
    pass

obj = Man()
print(obj.hair)
obj.eat()

# (2) 子父继承之后 , 子类不可以调用父类的私有成员
class Woman(Human):
    def myfunc(self):
        print(self.hair)
        # 无法调用父类私有成员
        # print(self.__age)

obj = Woman()
obj.myfunc()


# (3) 子父继承之后 , 子类可以改写父类公有成员
"""
子父继承之后,如果子类含有该成员,先优先调用自己的,
如果子类中不含有该成员,调用父类的,
父类如果也没有,直接报错
"""
class Children(Human):
    def eat(self):
        print("儿童下生都喝奶奶")

obj = Children()
obj.eat()
单继承 示例代码
# ### 多继承 : 一个子类有多个父类

# (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) super的使用
"""
(1)super本身是一个类 super()是一个对象 用于调用父类的绑定方法
(2)super() 只应用在绑定方法中,默认自动传递self对象 (前提:super所在作用域存在self)
(3)super用途: 解决复杂的多继承调用顺序    
"""
print("<=================>")
class Father():
    f_property = "玉树临风,花见花开,一枝梨花压海棠"
    def f_hobby():
        print("抽烟喝酒烫头,坑蒙拐骗偷")
        
class Mother():
    m_property = "俏皮可爱,沉鱼落雁,一直红杏出墙来"
    def m_hobby(self):
        print("打麻将,做头发,修电脑,买包包")

# 子类调用父类方法
class Son(Father,Mother):
    f_property = "头发是自来卷,说话是英国味,老婆说是胎教学的"
    m_property = "皮肤颜色是黑色的,黑种人,跟老爸长得不像"    

    # 1.利用类的方式调用成员属性和方法
    def skill1(self):
        print(Father.f_property)
        Father.f_hobby()
        
    # 2.利用self调用父类的成员属性和方法
    def skill2(self):
        print(self.m_property)
        self.m_hobby()
        
    # 3.利用super电泳父类的成员属性和方法
    def skill3(self):
        print(super().f_property)
        super().m_hobby()
        # super() 只能调用绑定方法,默认传递self参数;
        # super().f_hobby()  error
    
obj = Son()
# obj.skill1()
# obj.skill2()
obj.skill3()

"""
self 与 super 的区别
    self  在调用父类成员时,如果自己本类含有该成员,调用自己的,否则调用父类的
    super 永远只调用父类成员,不调用自己本类的
"""
多继承 示例代码
# ### 菱形继承 (钻石继承)
"""
     Human
Man             Woman
    Children
"""
class Human():
    pty = 1
    def feelT(self):
        print("远古人类,天热了,退毛1")
        """
            super调用方法时,会默认携带self对象进行传递
            从children 一直传递到最上层 Human
            通过self调用pty属性 得到4
        """
        print(self.pty)
        print("远古人类,天冷了,涨毛2")

class Man(Human):
    pty = 2 
    def feelT(self):
        print("现代人类,天热了,喝啤酒,开空调,吃烤串3")
        super().feelT()
        print("现代人类,洗热水脚,剃光头,喝白酒4")

class Woman(Human):
    pty = 3
    def feelT(self):
        print("女人天热了,脱光光,吹空调,扇扇子,喝热水5")
        super().feelT()
        print("女人天冷了,喝热水,穿貂皮,上火炕6")

class Children(Man,Woman):
    pty = 4
    def feelT(self):
        print("小孩天热了,打游戏,吃冰管,敲代码7")
        super().feelT()
        print("小孩天冷了,穿棉袄,用暖宝宝放衣服里8")

obj = Children()
obj.feelT()
"""
mro列表:方法调用顺序列表
    语法: 类.mro() 使用C3算法计算,返回一个列表
    super() 就是按照这个列表的顺序,依次进行调用
"""
lst = Children.mro()
print(lst)

"""
[
<class '__main__.Children'>, 
<class '__main__.Man'>, 
<class '__main__.Woman'>, 
<class '__main__.Human'>, 
<class 'object'>
]
73512648
"""
# super 就是用来解决多继承,复杂的调用关系(成员名字相同的情况下)
菱形继承 示例代码

2. 类的多态

# ### 多态 :不同的子类对象,调用相同的父类方法,产生不同的执行结果
"""
    关键字: 继承 , 重写
    特点  : 在不改变原有代码的前提下,而实现不同效果 , 多态针对的是对象
    对象不同,调用相同的方法,实现了不同的效果,是多态.
"""

"""
# issubclass 判断是否是子父关系
res = issubclass(Army,ceshi)
print(res)
# isinstance 判断对象是否是该类型 [在一条继承链上即可]
res = isinstance(obj_army,ceshi)
print(res)
"""


class ceshi():
    pass

class Soldier():
    def attack(self):
        pass

    def back(self):
        pass

# 陆军
class Army(Soldier):
    def attack(self):
        print("[陆军]你砍我 , 我砍你,一刀999级")

    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_air  = AirForce()

# 各就位准备
listvar = [obj_army,obj_navy,obj_air]


# 将军请下令
strvar = """
(1) 全体出击
(2) 全体撤退
(3) 空军上,其他人迅速撤离
"""
sign = True
while sign:    
    # 打印显示的内容
    print(strvar)
    num = input("将军,请下令")
    
    # 按钮只有1,2,3 是字符串
    if num in ["1","2","3"]:
        # 强转成数字
        num = int(num)
    
    # 循环列表
    for i in listvar:
        if num == 1:
            i.attack()
        elif num == 2:
            i.back()
        elif num == 3:
            # 判断该对象是AirForce创建的
            if isinstance(i,AirForce):
                i.attack()
            else:
                i.back()
        # 如果字符串是q,则退出整个程序
        elif num.upper() == "Q":
            print("风太大了,我听不到~")
            sign = False
            break
类的多态 示例代码

day18

猜你喜欢

转载自www.cnblogs.com/reachos/p/12168988.html