python3中super()参数意义和用法

python3中super()参数意义和用法

转载自 Python面向对象中super用法与MRO机制

转载自: Python中super的用法【转载】

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

https://blog.csdn.net/qq_39418396/article/details/97649164

我们知道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独立函数与“包裹方法“的演变

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

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

22

Python中的super()方法设计目的是用来解决多重继承时父类的查找问题,所以在单重继承中用不用 super 都没关系;但是,使用 super() 是一个好的习惯。一般我们在子类中需要调用父类的方法时才会这么用。

super()的好处就是可以避免直接使用父类的名字.主要用于多重继承,如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
MainWindow.setCentralWidget(self.centralWidget)
在这里插入图片描述
QtCore.QMetaObject.connectSlotsByName(MainWindow)

  • 17
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 在 Python ,`super()` 函数可以用于调用父类的方法。可以通过 `super()` 函数来调用父类的方法,而不需要明确指定父类的名称。 在 Python 3 ,`super()` 函数的使用方法如下: ```python class ChildClass(ParentClass): def some_method(self, arg): super().some_method(arg) # 继续执行子类的代码 ``` 在上述示例,`ChildClass` 继承自 `ParentClass`,并且重写了 `some_method` 方法。在子类的 `some_method` 方法,`super().some_method(arg)` 调用了父类的 `some_method` 方法,而后面的代码则继续执行子类的代码。 注意:`super()` 函数只能用于调用父类的实例方法,不能用于调用父类的类方法或静态方法。此外,如果子类和父类都有同名的方法,那么 `super()` 函数会优先调用父类的方法。 ### 回答2: 在Pythonsuper是一个内建函数,用于调用父类的方法。 super函数通常在子类的方法使用,当子类需要调用父类的方法时,可以使用super()函数来实现。这样可以避免直接使用父类的名称,使代码更加灵活和可维护。 super()函数通常在子类的方法作为第一个参数使用,例如super().__init__()。通过super()函数调用父类的方法时,会传递当前子类的实例作为参数自动传递给父类方法,从而使得父类的方法能够正确操作子类的实例。 使用super()函数的好处是,当父类发生变化时,子类无需修改调用父类方法的代码,因为super()函数会动态查找父类,保证调用的是正确的父类方法。这样可以减少重复、冗余的代码,提高代码的可维护性和扩展性。 尤其是在多重继承的情况下,使用super()函数可以更方便地调用父类的方法。super()函数按照方法解析顺序(MRO)自动查找父类,确保每个父类的方法只被调用一次。 总之,super()函数在Python的作用是用于调用父类的方法,并且在子类更方便、易维护地调用。 ### 回答3: 在Pythonsuper()是一个内置函数,用于调用父类的方法。它通常在子类的方法被调用,以便子类可以继承并扩展父类的功能。super()函数以两个参数呈现: 第一个参数是表示当前子类的类名,通常是使用super()的类的名称。 第二个参数是一个对象,用于指定一个对象,这个对象是当前子类的实例。如果不提供第二个参数,则默认会获取当前子类的实例。 通过使用super()函数,子类可以调用父类具有相同名称的方法,并且可以在子类的方法添加额外的逻辑。 使用super()的常见情况是在子类的__init__()方法。在子类,如果想要保留父类的一些初始化逻辑,可以通过调用super().__init__()来实现。这样子类在初始化时可以继承并执行父类的初始化步骤,然后再添加自己的初始化逻辑。 除了在__init__()方法使用外,super()也可以在任何子类方法使用,以便调用父类的方法。这种方法可以让子类继承父类的行为,并且可以在子类做一些额外的操作。 需要注意的是,在使用super()时,当一个类有多个父类时,super()只能调用其一个父类的方法。从技术上来说,super().__init__()只会调用父类的下一个方法。为了调用所有父类的方法,可以使用类名来调用相应的父类方法。 总结来说,super()函数在Python用于调用父类的方法。它通过简化子类的代码,使子类能够继承并扩展父类的功能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值