python3中super()参数意义和用法寻踪(个人理解)

        我们知道super()是为了类继承之后为了调用被重写的父类方法而使用,而且它应该还能通过参数精地准指出用的是哪一代父类的方法。然而对其内部的机理和它的传参上还是有些疑惑的。

参考了博文https://www.cnblogs.com/yanlin-10/p/10272338.html

帖子https://stackoverflow.com/questions/576169/understanding-python-super-with-init-methods/576183?r=SearchResults#576183

以及python官方文档 https://docs.python.org/2/library/functions.html#super之后进行了总结,

个人觉得super()的正确传参只有两种,super(类名,对象名)super(类名1,类名2)

--------->注意,在python3中,在定义类方法中直接调用不含参数的super(),也不会报错,解释的时候自动传入默认参数:

class A(Base):
    def __init__(self):
        super().__init__()  # 等同于 super(A, self).__init__()
        print('A.__init__')

参数必须满足的条件:

1)、super(cls,obj)即传入类名+对象名:

obj对象必须是cls类的对象(cls子类的对象当然也是cls类的对象) ,记作 type(obj) <= cls

2)、super(cls1,cls2)即传入两个类名:

cls2必须是cls1的子类或本身,记作cls2<=cls1

super起到代理作用,通过传入的两个类参数,定位你希望调用的 继承链中X父类中重写的同名方法,即super(cls1,cls2).fun是通过类cls1,类cls2,定位类X,并使用X类中的fun(self, ...)方法

两者的区别:

1) super(cls,obj).classfunc 是个'method',即视作类方法,obj作为X.classfunc的第一个self参数自动传入(隐式传入)

2)super(cls,cls).classfunc是个'function',即视作独立的普通函数,其原型中的第一个self参数也需要手动写入(显示传入)

https://stackoverflow.com/questions/576169/understanding-python-super-with-init-methods/576183?r=SearchResults#576183

上面讨论了python2的捆绑与非捆绑方法到Python3独立函数与“包裹方法“的演变

class X(??):
    ...
    def func(self,x1,x2):
        ???
        ???
    ...

class cls(??):
    ...
    
class cls(??):
    ...

obj = cls2(...)##实例化obj对象


##自动传参的类方法:
super(cls, obj).func(233,666)

##独立函数:
super(cls, cls2).func(obj, 233, 666)

分清了这两种用法的区别,super()的关键就是如何通过cls,cls2定位到类X

如果是单继承,直接找cls的上一级父类,如果是多继承甚至是钻石形状继承,则是通过类的mro(method resolution order)列表的下一项进行判断,比较复杂, 暂不讨论。

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值