zoukankan      html  css  js  c++  java
  • 多继承与super

    """
    多继承和super的关系
    """
    
    class Person:
        def __init__(self, name, age):
            print('Person类开始构造')
            self.name = name
            self.age = age
    
            print('Person类end构造')
    
        def love1(self):
            print('混吃等饿...')
    
    
    class Man(Person):
        def __init__(self, love, *args, **kwargs, ):
            self.love = love
            print('Man类开始构造')
            super(Man, self).__init__(*args, **kwargs)
            print('Man类end构造')
    
        def love1(self):
            """重写父类方法, 子类有新的实现"""
            print('%s,%d,爱好是%s' % (self.name, self.age, self.love))
    
    
    class WoMan(Person):
        def __init__(self, *args, **kwargs):
            print('WoMan类开始构造')
            super(WoMan, self).__init__(*args, **kwargs)
            # self.__love = love
            print('WoMan类end构造')
    
        def love1(self):
            print('我爱好购物 剁手')
    
        # print('%s,%d,爱好是%s' % (self.name, self.age, self.__love))
    
    
    class Son(Man, WoMan):
        """多继承:一个子类有多个父类 java没有多继承,c++有"""
    
        def __init__(self, *args, **kwargs):
            print('Son类开始构造')
            # 当前类的下一个类 -->Man  super(Son, self).__init__()==Son.__init__()
            super(Son, self).__init__(*args, **kwargs)
            print('Son类end构造')
    
        def love1(self):
            print('%s,%d,爱好是%s' % (self.name, self.age, self.love))
    
    
    if __name__ == '__main__':
        # p = Man('王二麻子', 50, '抽烟喝酒')
        # p.love()
        # w = WoMan('如花',18,'搓麻将')
        # w.love()
        datou = Son(name='大头', age=10,love='上学')
        datou.love1()
        # print(Son.mro())
        # print(Son.__mro__)
    
    # <__main__.Person object at 0x0000026F4622A7F0>  <>代表一个对象
    # -----------------------------单继承------------------------->
    """
    1.>单继承:
    因为子类需要使用父类提供的属性 必须要调用父类__init__()构造父类的属性
    
    2.>多继承<菱形继承也叫钻石继承>:
    父类.__init__(self,参数)构造父类的属性,导致父类的属性被构造多次,造成语义的二义性
    super关键字作用: 为了解决这个问题
    
    3.>MRO方法解析:
    特点:在这个顺序上,保证所有的类只初始化一次
    作用:使用这个顺序将所有的类的__init__()方法全部调用一次,
    解决了父类.__init__方式的问题
    super关键字的本质:就是使用了MRO顺序
    
    4.>查看MRO:
        类.mro()   -->[] 类方法返回 列表类型
        类.__mro__ -->() 魔法方法返回元组类型
        
    MRO顺序的特点:子类一定在父类的前面,同一级的兄弟类和子类的继承顺序有关系.
    
    5.>super
        super关键字的本质 ---> 使用了MRO顺序
        super(参数1,参数2)在py3中两个参数可以省略,在py2两个参数不可以省略
        参数1:是继承的类的对象
        参数2:一般是self,当前类的实例对象,一般只能是self
    py3中默认所有的类都是新式类<继承自object>
    py2中如果没有写父类,该类是经典类,如果写了父类,该类就是新式类.<父类就是object>
    super只能使用于新式类,经典类中不能使用super关键字
    super不一定调的是父类哦,因为mro算法顺序的具体不一定.有可能是父类,也有可能是兄弟类
    
    新式类:object的子类
    禁止:将 类.__init__()和super().__init__()方法混用
    """
    # def super(cls,self):
    #     return cls.mro[cls.find(cls) + 1]
    # # super取出了当前类在mro顺序中的下一个类
    
    """
    工作中:出现很多类的时候,使用UML 统一建模语言
    类图,对象图,活动图,协作图
    
    类属性可以被实例对象调用,反之则不行.类对象不可以调用实例属性.
    
    """
  • 相关阅读:
    Visual Studio 2010使用Visual Assist X的方法
    SQL Server 2000 评估版 升级到 SQL Server 2000 零售版
    双网卡多网络单主机同时访问
    开发即过程!立此纪念一个IT新名词的诞生
    delphi dxBarManager1 目录遍历 转为RzCheckTree2树
    5320 软件集合
    delphi tree 从一个表复制到另一个表
    DELPHI 排课系统课表
    长沙金思维 出现在GOOGLE的 金思维 相关搜索里啦!!
    如何在DBGrid的每一行前加一个单选框?
  • 原文地址:https://www.cnblogs.com/huaibin/p/12100313.html
Copyright © 2011-2022 走看看