python 类 子类 初始化 super

类的初始化方法

在写python代码时候,总能看到初始化__init__的定义,但其实
初始化方法__init__是可选。

class A:
	def __init__(self, x):
		self.x = x

可以看到类A具有的属性有属性变量x

a = A(4)
a.x  # 输出4

子类但初始化方法

如果子类没有新的构造参数,或者新的初始化逻辑,那么没有必要创建初始化__init__方法。因为按照搜索顺序,解释器会找到基类的初始化方法并执行。
基于此,我们需要在子类的初始化方法中显式调用基类方法。

  • 不显式调用
class A:
	def __init__(self, x):
		self.x = x

class B(A):
    def __init__(self, x, y):
        self.y = y

b = B(1, 2)
b.y  # 输出2
b.x  # 报错

当使用b.x调用基类的初始化方法时候就报错:

---------------------------------------
AttributeError     Traceback (most recent call last)
<ipython-input-4-628a1ebb8ea7> in <module>
----> 1 b.x

AttributeError: 'B' object has no attribute 'x'

可以看到此处是表明B类并没有属性x,这表明在B类初始化后,基类的初始化不被继承来,因此需要显式的调用, 使用super函数。

class C(A):
    def __init__(self, x, y):
        super().__init__(x)  # 显式调用基类
        self.y = y

c = C(1, 2)
c.x
c.y

在这里插入图片描述

注:
super() 函数是用于调用父类(超类)的一个方法。
super() 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。

参考

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uncle_ll

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值