五分钟内与您分享阅读Python中super()函数的经验与技巧,具体内容如下:

1、 在 Python 类继承中,子类继承父类并重载方法时,若需调用父类同名方法,通常有两种方式:super() 和 父类名。具体用法可参考以下代码示例:

2、 在`Base`类中有一个`move`方法用于改变位置。若我们在子类中希望添加记录每次移动偏移量的功能,可以通过重载`move`方法实现:先执行自定义操作(记录偏移量),再调用父类的`move`方法完成位置移动,这样无需重复实现移动逻辑。例如,在上述案例中我们通过`super`调用了父类方法,那么能否直接用`Base`来调用?

3、 当Base类调用父类函数时,需在函数中传入self参数。之前提到,类的普通函数需通过类对象调用,其第一个参数默认为self,调用时无需显式传递,因为通过对象调用时会自动传入。然而,如果直接用Base类名调用,方法内部需要明确self所指的对象。那么,这两种调用方式有区别吗?答案是肯定的。下面先来看一下super的定义,它会对理解这两种方式的区别有所帮助。

4、 可以看到,`super` 共有四种调用形式:
5、 1. `super()`:等价于 `super(当前类名, self)`,这是 Python 3 中常用的形式。
6、 2. `super(type)`:不绑定任何对象,适用于类方法或静态方法。
7、 3. `super(type, obj)`:绑定到具体对象 `obj`,要求 `obj` 是 `type` 类型或其子类的实例。
8、 4. `super(type, type2)`:绑定到类型 `type2`,要求 `type2` 是 `type` 的子类。
9、 这里重点介绍 `super()` 和 `super(type, obj)`,它们是实际开发中最常见的用法。在前面的例子中,`super` 的行为与直接调用父类 `Base` 方法类似。接下来通过另一个例子进一步说明其用法。

10、 四个类中,Base的初始化函数被调用了两次,这是为什么?是因为Sub.__init__里同时调用了Device1和Device2的初始化方法吗?确实如此。那能不能只调用其中一个?如果只调用Device1.__init__,Base会如何?结果会怎样?这样Base就只会被调用一次了。

11、 由于缺乏name2属性,且Device2的初始化方法__init__未被调用,导致name2未定义。若将Base替换为super,结果会如何?这值得进一步探讨。
