• python多继承中子类访问祖先类的同名成员


    子类调用父类的同名成员

    方式1:

    class A:
        def f_a(self):
            print("----A----")
    
    class B:
        def f_a(self):
            print("----B----")
    
    class C(A, B):
        def f_a(self):
            A.f_a(self)  # 子类调用父类同名方法,括号里要写self,表明这是一个类调用
            B.f_a(self)  # 但这样如果修改了父类方法,那么子类就要多处修改
            print('----C----')
    
    c = C()
    c.f_a()
    
    # ----A----
    # ----B----
    # ----C----

    方式2:使用super()

    class A:
        def f_a(self):
            print("----A----")
    
    class B:
        def f_a(self):
            print("----B----")
    
    class C(A, B):
        def f_a(self):
            A.f_a(self) 
            super().f_a()  
            print('----C----')
    
    c = C()
    c.f_a()
    # ----A----
    # ----A----
    # ----C----

    方式3:但super会有一个从左到右的继承顺序问题,默认是先继承左边,本例中为class A,如果我就是想用super()的方法调用B的成员,可以显式指明,如下例

    class A:
        def f_a(self):
            print("----A----")
    
    class B(A):
        def f_a(self):
            print("----B----")
    
    class C(B):
        def f_a(self):
            super(B, self).f_a()  # 指B的父类
            super().f_a()  # super(C, self).f_a(), 指C的直接父类
    #super第一个参数填的是当前类
            print('----C----')
    
    c = C()
    c.f_a()
    # ----A----
    # ----B----
    # ----C----

    方式4:再来一个例子,在多重继承中,最好显式指明super()当前类的父类

    class A:
        def f_a(self):
            print("----A----")
    
    class B(A):
        def f_a(self):
            print("----B----")
    
    class C(B):
        def f_a(self):
            print('----C----')
    
    class D(C):
        def f_a(self):
            super(D, self).f_a()  # class C's f_a 
            super(C, self).f_a()  # class C's parent class's(B) f_a
            # super()
            print('----D----')
            pass
    
    d = D()
    d.f_a()
    
    # ----C----
    # ----B----
    # ----D----
  • 相关阅读:
    Moodle 3.8 安装过程
    Discourse 数据分发
    Moodle 安装的时候提示 original IP
    Apache 安装运行测时候提示错误 (13)Permission denied: AH00091: httpd: could not open error log file
    Apache 配置 SELinux 命令的时候的命令 semanage
    Apache Httpd 安装 AH00558错误
    Discourse 如何修改用户自己的密码
    Discourse 如何限制注册用户的密码长度
    Discourse 的快捷键列表
    S3 存储附件和图片无法上传
  • 原文地址:https://www.cnblogs.com/sayiqiu/p/10562278.html
Copyright © 2020-2023  润新知