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 调用完成
    """
    
  • 相关阅读:
    dedeCMS自定义dede标签
    phpstrom配置Xdebug
    ElasticSearch安装 --- windows版
    MySQL语句优化
    PHP高并发商城秒杀
    【java_需阅读】Java中static关键字用法总结
    【java】public,private和protected
    PICT测试工具的安装及使用
    【android】Android am命令使用
    【python】获取指定网页上的所有超级链接
  • 原文地址:https://www.cnblogs.com/donghaoblogs/p/10709922.html
Copyright © 2011-2022 走看看