• python学习第21天


    一.面向对象-继承

    继承:一个类除了自身所拥有的属性方法之外,还获取了另外一个类的成员属性和方法

    子类:一个类继承另外一个类,也叫做衍生类

    父类:被继承的类叫做父类,也叫做基类,超类

    继承分为

    1)单继承

    2)多继承

    python中所有的类都默认继承父类object

    1.1单继承

    class Human(object):
       hair = "金色"
       sex = "男"
       
       def eat(self):
          print("人类天生就喜欢吃吃吃")
          
       def la(self):
          print("人类天生就喜欢拉拉拉")
          
       def __makebaby(self):
          print("人类天生就能够繁衍后代")
    

    (1)子父继承之后,子类可以调用父类所有的公有成员

    class Man(Human):  #class  Man(父类)
       pass
       
    obj = Man() # Man(构造方法的参数)
    print(obj.hair) # 金色
    

    (2)子父继承之后,子类不可以调用父类的私有成员

    class Woman(Human): 
       def pub_makbaby(self):
          self.__makebaby()
       
    obj = Woman()
    obj.eat()
    # obj.__makebaby() 不行
    # obj.pub_makbaby()不行
    

    (3)子父继承之后,子类可以重写父类的同名方法

    子父继承后

    如果子类里面有该成员属性方法,优先调用自己的

    如果没有该成员,那么调用父类的公有成员

    如果都没有直接报错

    class Children(Human):
       sex = "女性"
       def eat(self):
          print("小孩下生只能吃奶奶~")
       
    obj = Children()
    print(obj.sex)
    obj.eat()
    

    1.2多继承

    (1)基本语法

    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()
    

    (2) super用法

    super本身是一个类,super()是一个对象,用于调用父类的绑定方法

    super()只应用在绑定方法中,默认自动传递self对象(前提:super所在作用域存在self)

    super用途:解决复杂的多继承调用顺序

    1.3菱形继承

    super在菱形继承中调用子类上一层级所有的父类,都调用完了再找上一层级的父类调用,然后在依次返回调用结果

        Human
    Man         Woman
       Children
    
    class BigMan():
       pass
    
    class Human():
       pty = 4
       def feelT(self):
          # self 此刻接受的是Children的对象
          print("原始人类天热了,让后裔把太阳射下来1")
          print(self.pty) #  obj.pty = 1
          print("原始人类天冷了,让女娲补天,防止漏风2")
       
    class Man(Human):
       pty = 3
       def feelT(self):
          # self 此刻接受的是Children的对象
          print("现代男人天热了,吹吹空调3")
          super().feelT()
          print("现代男人天冷了,吹暖气4")
          
    class Woman(Human):
       pty = 2
       def feelT(self):
          # # self 此刻接受的是Children的对象
          print("现代女人天热了,洗洗澡5")
          super().feelT()
          print("现代男人天冷了,吃雪糕6")
       
    class Children(Man,Woman):
       pty = 1
       def feelT(self):
          print("现代小朋友天热了,洗海澡7")
          # super()调用方法时候,会携带者当前类的对象进行传递
          super().feelT()
          print("现代小朋友天冷了,钻被窝8")
          
       
    obj = Children()
    obj.feelT()
    打印结果
    现代小朋友天热了,洗海澡7
    现代男人天热了,吹吹空调3
    现代女人天热了,洗洗澡5
    原始人类天热了,让后裔把太阳射下来1
    1
    原始人类天冷了,让女娲补天,防止漏风2
    现代男人天冷了,吃雪糕6
    现代男人天冷了,吹暖气4
    现代小朋友天冷了,钻被窝8
    

    (1)mro列表 : super用途的体现,解决复杂的多继承调用顺序

    类.mro() 返回的是方法调用顺序的列表,针对于多继承下的同名方法,按照列表的顺序依次调用

    lst = Children.mro()
    print(lst)
    """[<class '__main__.Children'>, <class '__main__.Man'>, <class '__main__.Woman'>, <class '__main__.Human'>, <class 'object'>]"""
    

    (2) issubclass判断是否存在子父关系(语法使用与isinstance一模一样)

    只要在一个继承链上即可(有血缘关系即可)应用范围在类的身上

    res = issubclass(Children,Man)
    res = issubclass(Children,Woman)
    res = issubclass(Children,Human)
    res = issubclass(Children,BigMan)
    res = issubclass(Children , (Man,Woman,Human,BigMan))
    print(res)
    

    (3) isinstance 判断类型

    只要在一个继承链上即可(有血缘关系即可),是在判断对象和类之间的关系

    res = isinstance(obj,Children)
    res = isinstance(obj,Man)
    res = isinstance(obj,Woman)
    res = isinstance(obj,BigMan) # False
    print(res)
    

    __ dict __返回的是一个字典,类或者对象的所有成员

    用 in 来判断成员在不在这个类或者对象中

  • 相关阅读:
    行为型模式续(中介者模式 + 解释器模式)
    行为型模式下<迭代器模式、访问者模式、备忘录模式>
    行为型模式中<职责链模式、状态模式、观察者模式>
    下载vuejs,Hello Vue(vscode)
    node.js运行配置(vs code非控制台输出)
    node.js环境配置(windows系统)
    玩转visual studio系列之类设计图
    xml基础之二(XML结构【2】)DTD文档模版
    xml基础之二(XML结构【1】)
    XML的基础之一(概念和语法)
  • 原文地址:https://www.cnblogs.com/yunchao-520/p/12976580.html
Copyright © 2020-2023  润新知