Python中子类调用父类的初始化方法

Python中子类调用父类的初始化方法

前言

python中进行面向对象编程,当在子类的实例中调用父类的属性时,由于子类的__init__方法重写了父类的__init__方法,如果在子类中这些属性未经过初始化,使用时就会出错。例如以下的代码:

class A(object):
    def __init__(self):
        self.a = 5

    def function_a(self):
        print('I am from A, my value is %d' % self.a)


class B(A):
    def __init__(self):
        self.b = 10

    def function_b(self):
      print('I am from B, my value is %d' % self.b)
       self.function_a()    # 调用类A的方法,出错


if __name__ == '__main__':
    b = B()
    b.function_b()

  执行结果如下:

 

 

 这时候就需要在类B的__init__方法中先执行类A的__init__方法,脚本才可以正确执行。Python提供了两种方法来完成这个任务。

方法一: 调用未绑定的父类__init__方法

在类的方法定义时,首个参数均为self。当实例化这个类时,self就被自动绑定到当前的实例。绑定也就意味着这个实例的属性,方法都可以通过‘self.***的方式进行调用。但是如果通过类名直接调用类的方法,self参数就不会被自动绑定到实例上,可以绑定到我们指定的实例上。也就是子类的实例上,在这里就是类B了。
所以这里所说的未绑定的父类__init__方法 就是指未绑定父类实例的父类__init__方法。
具体的代码如下:

class A(object):
    def __init__(self):
        self.a = 5

    def function_a(self):
        print('I am from A, my value is %d' % self.a)


class B(A):
    def __init__(self):
        A.__init__(self)   # 此处修改了。如果类A的__init__方法需要传参,也需要传入对应的参数
        self.b = 10

    def function_b(self):
        print('I am from B, my value is %d' % self.b)
        self.function_a()



if __name__ == '__main__':
    b = B()
    b.function_b()

  执行结果如下:

 

 

方法二:调用super函数

super函数是用于调用父类的一个方法,主要是用于解决多继承问题,避免多继承带来的一些问题,当然也可以用来解决单继承问题,调用父类的__init__方法了。

具体代码如下:

class A(object):
    def __init__(self):
        self.a = 5

    def function_a(self):
        print('I am from A, my value is %d' % self.a)


class B(A):
    def __init__(self):
        super(B, self).__init__()   # 此处修改了
        self.b = 10

    def function_b(self):
        print('I am from B, my value is %d' % self.b)
        self.function_a()


if __name__ == '__main__':
    b = B()
    b.function_b()

  执行结果如下:

 

posted on 2021-09-30 11:06  groby  阅读(676)  评论(0编辑  收藏  举报