对于Python中 super().__init__()的测试和理解

本文通过三个测试案例详细解析了super().init()在Python中单继承情况下的作用及其实现原理,展示了如何通过该方法正确地初始化父类,使得子类能够顺利调用父类的属性和方法。

super().init()含义(单继承,即只有一个父类)
测试一:
在没有super(A, self).init()时调用A的父类Root的属性和方法(方法里不对Root数据进行二次操作)。

class Root(object):
    def __init__(self):
        self.x = "这是属性"
    def fun(self):
        print("这是方法")
class A(Root):
    def __init__(self):
        print("实例化时执行")

运行结果:
在这里插入图片描述
可以看到此时父类的方法继承成功,可以使用,但是父类的属性却未继承,并不能用。
测试二:
在没有super(A,self).init()时调用A的父类Root的属性和方法(方法里对Root数据进行二次操作)。

class Root(object):
    def __init__(self):
        self.x = "这是属性"
    def fun(self):
        print(self.x)
        print("这是方法")
class A(Root):
    def __init__(self):
        print("实例化时执行")

运行结果:
在这里插入图片描述
此时报错和测试一相似,果然,还是不能用父类的属性。
测试三:加入super(A, self).init()时调用A的父类Root的属性和方法(方法里对Root数据进行二次操作)

class Root(object):
    def __init__(self):
        self.x = "这是属性"
    def fun(self):
        print(self.x)
        print("这是方法")
class A(Root):
    def __init__(self):
        super(A,self).__init__()
        print("实例化时执行")

运行结果:
在这里插入图片描述
此时A已经成功继承了父类的属性,所以super().init()的作用也就显而易见了,就是执行父类的构造函数,使得我们能够调用父类的属性。
上面是单继承情况,我们也会遇到多继承情况,用法类似,但是相比另一种Root.init(self),在继承时会跳过重复继承,节省了资源。
参考博客:https://blog.youkuaiyun.com/qq_38787214/article/details/87902291

Python 中,`super().__init__()` 是一种用于调用父类(基类)构造方法(即 `__init__()` 方法)的机制。它的主要作用是在类的继承结构中,特别是在子类中,调用父类的初始化逻辑,从而确保子类能够继承并使用父类的属性方法。 ### `super()` 函数的作用 `super()` 是 Python 的内置函数,它返回一个临时对象,该对象可以用来调用父类的方法。使用 `super()` 的一个关键优势是避免硬编码父类的名称,从而提高代码的可维护性通用性。例如,在多重继承的情况下,`super()` 会按照方法解析顺序(Method Resolution Order, MRO)依次调用父类的方法[^1]。 ### `__init__()` 方法的作用 `__init__()` 是 Python 中的构造函数,当创建类的实例时会自动调用该方法。通常用于初始化对象的属性。在子类中,如果希望使用父类的初始化逻辑,则需要显式调用父类的 `__init__()` 方法。使用 `super().__init__()` 是一种推荐的方式,而不是直接通过父类名称调用。 ### `super().__init__()` 的基本用法 以下是一个简单的示例,展示如何在子类中使用 `super().__init__()` 调用父类的构造方法: ```python class A: def __init__(self): self.b = "xxx" class B(A): def __init__(self): super().__init__() # 调用父类 A 的 __init__ 方法 self.c = False def func2(self): print(self.b) print(self.c) b = B() b.func2() ``` 输出结果为: ``` xxx False ``` 在上述代码中,`B` 类继承自 `A` 类。`B` 的构造函数中使用了 `super().__init__()`,从而调用了父类 `A` 的构造函数,初始化了 `self.b` 属性。随后,`B` 类添加了 `self.c` 属性并定义了方法 `func2()`,最终输出了从父类继承的属性子类自身定义的属性[^2]。 ### `super()` 的多重继承行为 在多重继承的场景下,`super()` 会按照 MRO(Method Resolution Order)顺序依次调用父类的方法。例如: ```python class A: def __init__(self): print("A.__init__") class B(A): def __init__(self): super().__init__() print("B.__init__") class C(A): def __init__(self): super().__init__() print("C.__init__") class D(B, C): def __init__(self): super().__init__() print("D.__init__") d = D() ``` 输出结果为: ``` A.__init__ C.__init__ B.__init__ D.__init__ ``` 在上述代码中,`D` 类继承自 `B` `C`,而 `B` `C` 都继承自 `A`。当调用 `super().__init__()` 时,`D` 类按照 MRO 顺序依次调用了 `B`、`C` `A` 的构造函数,确保所有父类的初始化逻辑都被执行。 ### 总结 `super().__init__()` 的核心作用是允许子类在不显式引用父类名的情况下调用父类的构造方法,这种方式不仅提高了代码的可维护性,而且在多重继承中能够按照正确的顺序调用父类的方法。通过合理使用 `super()`,可以编写出更清晰、更通用的面向对象代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值