python mro文件_Python中MRO

python super()调用多重继承函数问题

https://blog.csdn.net/dl_chenbo/article/details/80602113

如上博文也阐明了关于多重继承MRO问题,初次接触肯定有违你的初衷。 明白MRO的算法之后,还要考虑一个问题就是不同种类的参数问题:

class CommonBase:

def __init__(self):

print('CommonBase')

super().__init__()

class Base1(CommonBase):

def __init__(self):

print('Base1')

super().__init__()

class Base2(CommonBase):

def __init__(self,arg):

print('Base2')

super().__init__()

class MyClass(Base1,Base2):

def __init__(self,arg):

print('MyClass')

super().__init__(arg)

MyClass(10)

# 报错如下:

Traceback (most recent call last):

File "E:/QMYG.BLOG/awesome-py3-webapp/test2.py", line 47, in

MyClass(10)

File "E:/QMYG.BLOG/awesome-py3-webapp/test2.py", line 45, in __init__

super().__init__(arg)

TypeError: __init__() takes 1 positional argument but 2 were given

解决如上问题,可以使用arg,*kw接收参数,但是这种设计方式不推荐,任何参数都可以传入使得代码比较脆弱。

最佳实践

应该避免多重继承

super的使用必须一致

显示地继承object

调用父类时必须查看类的层次结构,通过mro

python私有属性

使用双下划线为前缀,解析器会把该属性重命名,使用组合名称依然可以访问该属性。真正定义私有属性的时候约定使用 _ 前缀,虽然同样可以访问,但不会调用任何名称修饰的算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值