Python的super ()内置函数介绍
super内置函数官方文档https://docs.python.org/zh-cn/3/library/functions.html#super
文章来源地址https://uudwc.com/A/WvG8Z
使用super()函数可以在子类中调用父类的方法,例如,在子类的__init__()方法中使用super().__init__()可以调用父类的__init__()方法。
super()函数实际上用于间接访问父类的方法,而不仅仅是简单地调用父类方法。使用super()可以在子类中按照方法解析顺序(Method Resolution Order,MRO)来查找并调用父类的方法。这种方法解析顺序决定了在多重继承中方法的调用顺序。
以下是super()函数的基本语法:
super().method_name(args)
其中:
super():表示调用父类。
method_name:要调用的父类方法名。
args:传递给父类方法的参数。
需要注意的是,super()函数只能在新式类(继承自object)中使用。Python 3.x版本,只有新式类的定义方式。在Python 2.x 版本中,存在两种类:经典类(old-style class)和新式类(new-style class)。而在 Python 3.x 版本中,所有的类都是新式类。官方宣布,2020 年 1 月 1 日, 停止 Python 2 的更新。
【在Python中,术语“新式类(new-style class)”是指从名为“object”的内置类派生出来的类。
新式类(new-style class)和经典类(old-style class)主要区别如下:
继承自 object(Inheritance from "object"):所有新式类都隐式或显式地继承自内置类 object,而经典类则不会。
方法解析顺序(MRO):新式类使用 C3 算法来计算方法解析顺序,而经典类使用深度优先算法。MRO 决定了方法查找的顺序,使得多重继承更加可控和直观。
特性访问控制:新式类提供了 @property 装饰器和 property() 函数,使得属性访问更加灵活和可控。
构造函数(Constructor):新式类引入了 __new__() 方法和 super() 函数,使得实例的创建和初始化更加可定制和灵活。】
下面是一个super内置函数使用示例:
class Parent:
def __init__(self, name):
self.name = name
def greet(self):
print(f"Hello, {self.name}!")
#子类Child继承自父类Parent
class Child(Parent):
def __init__(self, name, age):
super().__init__(name) #使用super().__init__()调用父类Parent的构造函数
self.age = age
def greet(self):
super().greet() #调用父类的greet()方法
print(f"I'm {self.age} years old.")
child = Child("Alice", 10) #创建了一个Child类的实例child,并传入名字"Alice"和年龄10。
child.greet()
输出如下:
Hello, Alice!
I'm 10 years old.
在上述示例中,Child类继承自Parent类。通过使用super()函数,我们在Child类的__init__方法中调用了父类的__init__方法,并传递了必要的参数。
在Child类中,我们通过Child(Parent)指定继承关系,将Parent作为基类。Child类定义了一个新的构造函数__init__(self, name, age),它接收一个名字和年龄参数。通过调用super().__init__(name),我们在子类中调用父类的构造函数,以便父类中的初始化逻辑得到执行。然后,我们将传入的年龄存储在实例变量self.age中。此外,Child类还重写了父类的greet()方法。在子类的greet()方法中,我们首先使用super().greet()来调用父类的greet()方法,以输出父类的问候语:“Hello, Alice!”。然后,子类的特定年龄信息:“I'm 10 years old.”。
Python中super()详解及应用场景举例https://zhuanlan.zhihu.com/p/415729655
Python MRO方法解析顺序详解https://www.zhihu.com/tardis/zm/art/416584599文章来源:https://uudwc.com/A/WvG8Z