zoukankan      html  css  js  c++  java
  • MRO

    Python3里面,有多继承的时候,往往会出现调用Super失败的情况。Python里存在一种多继承 Super的调用顺序(C3算法),保证每个类调用一次。
    体现:类名.__mro__
    使用Super时,调用当前类的下一个类的方法

    多次调用:

    class Parent(object):
        def __init__(self,name):
            print('parent 开始调用')
            self.name = name
            print('Parent 调用完成')
    
    
    
    class Son1(Parent):
        def __init__(self,name,age):
            print('Son1 调用')
            self.age = age
            Parent.__init__(self,name)
            print('Son1 调用完成')
    
    
    class Son2(Parent):
        def __init__(self,name,gender):
            print('Son2 调用')
            self.gender = gender
            Parent.__init__(self, name)
            print('Son2 调用完成')
    
    
    
    class Grandson(Son1,Son2):
        def __init__(self,name,gender,age):
            print('Grandson 调用')
            self.gender = gender
            self.age = age
            Son1.__init__(self,name,age) #单独调用父类方法
            Son2.__init__(self,name,gender)
            print('Grandson 调用完成')
    s = Grandson('123','男',19)
    
    """
    Grandson 调用
    Son1 调用
    parent 开始调用
    Parent 调用完成
    Son1 调用完成
    Son2 调用
    parent 开始调用
    Parent 调用完成
    Son2 调用完成
    Grandson 调用完成
    """
    

    防止调用父类调用多次

    class Parent(object):
        def __init__(self,name,*args,**kwargs):
            print('parent 开始调用')
            self.name = name
            print('Parent 调用完成')
    
    class Son1(Parent):
        def __init__(self,name,age,*args,**kwargs):
            print('Son1 调用')
            self.age = age
            super().__init__(self,name,*args,**kwargs)
            print('Son1 调用完成')
    
    class Son2(Parent):
        def __init__(self,name,gender,*args,**kwargs):
            print('Son2 调用')
            self.gender = gender
            super().__init__(self,name,*args,**kwargs)
            print('Son2 调用完成')
    
    class Grandson(Son1,Son2):
        def __init__(self,name,gender,age):
            print('Grandson 调用')
            self.gender = gender
            self.age = age
            super().__init__(name,gender,age) #  == super(Grandson, self).__init__(name,gender)
            print('Grandson 调用完成')
    
    s = Grandson('123','男',19)
    """
    Grandson 调用
    Son1 调用
    Son2 调用
    parent 开始调用
    Parent 调用完成
    Son2 调用完成
    Son1 调用完成
    Grandson 调用完成"""
    

    在 Python 中用到多继承时,调用父类方法很容易出错:父类方法调用了多次,只能通过__mro__魔法方法来获取调用顺序

    print(Grandson.__mro__) #查看调用顺序
    """
    (<class '__main__.Grandson'>, 
    <class '__main__.Son1'>, 
    <class '__main__.Son2'>, 
    <class '__main__.Parent'>, 
    <class 'object'>)
    """
    
    
    #super().__init__(name,gender,age)   == super(Grandson, self).__init__(name,gender)
    
    
    
    super(Son1,self).__init__(name,age,gender)
    
    """
    Grandson 调用
    Son2 调用
    parent 开始调用
    Parent 调用完成
    Son2 调用完成
    Grandson 调用完成
    """
    
  • 相关阅读:
    SGU 127. Telephone directory --- 模拟
    SGU 126. Boxes --- 模拟
    SGU 128. Snake --- 暴力枚举+并查集+贪心+计算几何
    Codeforces Round #246 (Div. 2) B. Football Kit
    Codeforces Round #252 (Div. 2) C. Valera and Tubes
    Codeforces Round #251 (Div. 2) C. Devu and Partitioning of the Array
    codeforces --- Round #250 (Div. 2) B. The Child and Set
    codeforces --- Round #250 (Div. 2) A. The Child and Homework
    AFNetworking 动态修改acceptableContentTypes 设置ContentType
    swift pod第三方OC库使用use_frameworks!导致#import提示无法找到头文件
  • 原文地址:https://www.cnblogs.com/donghaoblogs/p/10709922.html
Copyright © 2011-2022 走看看