zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    <BackTracking> dfs: 39 40
    <Tree> 110 124
    <Tree.PreOrder> DFS 113, 129
    <Math> 50 367
    <String> 49 87
    Haproxy配置Rabbitmq集群负载均衡
    Rabbitmq镜像集群的搭建
    rabbitmq常用命令
    Linux安装rabbitmq
    Docker自定义网络
  • 原文地址:https://www.cnblogs.com/reachos/p/12168988.html
Copyright © 2011-2022 走看看