• Python子类调用父类内属性的方法


    常见的就是初始化方法__init__()

    python中类的初始化方法是__init__(),因此父类子类的初始化方法都是这个,如果子类不实现这个函数,初始化时调用父类的初始化函数,如果子类实现这个函数,就覆盖了父类的这个函数,既然继承父类,就要在这个函数里显式调用一下父类的__init__(),这跟C++,jAVA不一样,他们是自动调用父类初始化函数的。

    调用父类函数有以下方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # -*- coding:utf-8 -*-
    class Animal():
        def __init__(self, name):
            self.name = name
     
        def saySomething(self):
            print("I am " + self.name)
     
    class Dog(Animal):
        def __init__(self, name):
            super().__init__(name)
     
        def saySomething(self):
            print ("I am "+ self.name + ", and I can bark")

      

    1.直接写类名调用: parent_class.parent_attribute(self)

    2.用 super(type, obj).method(arg)方法调用:super(child_class, child_object).parent_attribute(arg)   【不需要写self】

    3.在类定义中调用本类的父类方法,可以直接 super().parent_method(arg)  【个人推崇这种写法】

    样例如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    # -*- coding:utf-8 -*-
    # file_name: python_class_inheritance_example.py
    class Animal():
        def __init__(self, name):
            self.name = name
     
        def saySomething(self):
            print("I am " + self.name)
     
    class Dog(Animal):
        def __init__(self, name):
            super().__init__(name)
     
        def saySomething(self):
            print ("I am "+ self.name + ", and I can bark")
     
        def animal_say_1(self):
            # 子类调用父类的方法
            #  方式1
            super(Dog, self).saySomething()
     
        def animal_say_2(self):
            #  方式2 [推荐]
            super().saySomething()
         
        def animal_say_3(self):
            # 方式3
            Animal.saySomething(self)
     
     
    if __name__ == "__main__":
        dog = Dog("Blake")
        dog.saySomething()
        dog.animal_say_1()
        dog.animal_say_2()
        dog.animal_say_3()
        # 子类对象调用被覆盖的父类方法
        super(Dog, dog).saySomething()
     
    '''
    输出结果如下:
    python python_class_inheritance_example.py
    I am Blake, and I can bark
    I am Blake
    I am Blake
    I am Blake
    I am Blake
    '''

    如下代码:

    class A:
        def __init__(self):
            self.namea="aaa"
        def funca(self):
            print "function a : %s"%self.namea
    class B(A):
        def __init__(self):
            self.nameb="bbb"
        def funcb(self):
            print "function b : %s"%self.nameb
    b=B()
    print b.nameb
    b.funcb()
    b.funca()
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    运行后会报错:

    bbb
    function b : bbb
    Traceback (most recent call last):
      File "D:workbenchpythonMyPythonProjectteststudyoverwrite_method.py", line 19, in <module>
        print b.funca()
      File "D:workbenchpythonMyPythonProjectteststudyoverwrite_method.py", line 6, in funca
        print "function a : %s"%self.namea
    AttributeError: B instance has no attribute 'namea'
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    两种方法解决: 
    - 第一种

    class A:
        def __init__(self):
            self.namea="aaa"
        def funca(self):
            print "function a : %s"%self.namea
    class B(A):
        def __init__(self):
            #这一行解决了问题
            A.__init__(self)
            self.nameb="bbb"
        def funcb(self):
            print "function b : %s"%self.nameb
    b=B()
    print b.nameb
    b.funcb()
    b.funca()
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 第二种:
    #父类需要继承object对象
    class A(object):
        def __init__(self):
            self.namea="aaa"
        def funca(self):
            print "function a : %s"%self.namea
    class B(A):
        def __init__(self):
            #这一行解决问题
            super(B,self).__init__()
            self.nameb="bbb"
        def funcb(self):
            print "function b : %s"%self.nameb
    b=B()
    print b.nameb
    b.funcb()
    b.funca()
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    PS:让类A继承自object类,这样才能使用super函数,因为这是python的“新式类”支持的特性。当前的class和对象可以作为super函数的参数使用,调用函数返回的对象的任何方法都是调用超类的方法,而不是当前类的方法。

    优劣: 
    - 方法一更直观,方法二可以一次初始化所有超类 
    - super函数比在超类中直接调用未绑定方法更直观,但是其最大的优点是如果子类继承了多个父类,它只需要使用一次super函数就可以。然而如果没有这个需求,直接使用A.init(self)更直观一些。

  • 相关阅读:
    多线程 -- H2O 生成、交替打印字符串
    打印零与奇偶数
    h2数据库的使用
    rtx应用和开发
    MongoDB--副本集
    Python 推导式
    Bootstrap组件
    Python logging日志的自动分割
    python watchdog监控文件修改
    Linux流量监控iftop
  • 原文地址:https://www.cnblogs.com/ExMan/p/8457127.html
Copyright © 2020-2023  润新知