Python super() 函数允许我们明确引用父类。在继承的情况下,当我们想调用父类函数时,它非常有用。
Python super
要了解 Python super 函数,您必须了解Python 继承。在 Python 继承中,子类继承自超类。Python super() 函数允许我们隐式引用超类。因此,Python super 使我们的任务更轻松、舒适。在从子类引用超类时,我们不需要显式地写出超类的名称。在接下来的部分中,我们将讨论 Python super 函数。
Python super 函数示例
首先,只需看一下我们在Python 继承教程中使用的以下代码。在该示例代码中,超类是Person
,子类是Student
。因此,代码如下。
class Person:
# 初始化变量
name = ""
age = 0
# 定义构造函数
def __init__(self, person_name, person_age):
self.name = person_name
self.age = person_age
# 定义类方法
def show_name(self):
print(self.name)
def show_age(self):
print(self.age)
# 子类定义开始
class Student(Person):
studentId = ""
def __init__(self, student_name, student_age, student_id):
Person.__init__(self, student_name, student_age)
self.studentId = student_id
def get_id(self):
return self.studentId # returns the value of student id
# 子类定义结束
# 创建超类对象
person1 = Person("Richard", 23)
# 调用对象的成员方法
person1.show_age()
# 创建子类对象
student1 = Student("Max", 22, "102")
print(student1.get_id())
student1.show_name()
在上面的例子中,我们调用了父类函数如下:
Person.__init__(self, student_name, student_age)
我们可以用python的super函数调用来替代这个,如下所示。
super().__init__(student_name, student_age)
输出在两种情况下都将保持不变,如下图所示。
Python 3 super
请注意,上述语法适用于Python 3 super函数。如果您使用的是Python 2.x版本,则会有轻微差异,您需要进行以下更改:
class Person(object):
...
super(Student, self).__init__(student_name, student_age)
第一个更改是将object
作为Person的基类。在Python 2.x版本中,使用super函数时需要这样做。否则,您将收到以下错误:
Traceback (most recent call last):
File "super_example.py", line 40, in <module>
student1 = Student("Max", 22, "102")
File "super_example.py", line 25, in __init__
super(Student, self).__init__(student_name, student_age)
TypeError: must be type, not classobj
超函数本身的语法也有第二个更改。正如您所看到的,Python 3的super函数使用起来更加简单,语法看起来也更清晰。
Python 的 super 函數與多層級繼承
正如我們先前所述,Python 的 super() 函數允許我們隱含地參考超類。但在多層級繼承的情況下,它將參考哪個類?嗯,Python 的 super() 將始終參考直接的超類。此外,Python 的 super() 函數不僅可以參考 __init__() 函數,還可以調用超類的所有其他函數。因此,在下面的示例中,我們將看到這一點。
class A:
def __init__(self):
print('Initializing: class A')
def sub_method(self, b):
print('Printing from class A:', b)
class B(A):
def __init__(self):
print('Initializing: class B')
super().__init__()
def sub_method(self, b):
print('Printing from class B:', b)
super().sub_method(b + 1)
class C(B):
def __init__(self):
print('Initializing: class C')
super().__init__()
def sub_method(self, b):
print('Printing from class C:', b)
super().sub_method(b + 1)
if __name__ == '__main__':
c = C()
c.sub_method(1)
讓我們來看看上面的 Python 3 中具有多層級繼承的 super 示例的輸出。
Initializing: class C
Initializing: class B
Initializing: class A
Printing from class C: 1
Printing from class B: 2
Printing from class A: 3
因此,從輸出中我們可以清楚地看到,類 C 的 __init__() 函數首先被調用,然後是類 B,然後是類 A。通過調用 sub_method() 函數也發生了類似的事情。
我們為什麼需要 Python super 函數
如果您在Java语言方面有过先前的经验,那么您应该知道基类也称为一个super对象。因此,这个概念实际上对程序员很有用。然而,Python也为程序员保留了使用超类名称引用它们的便利设施。如果您的程序包含多层继承,那么这个super()函数对您是有帮助的。这就是关于Python super函数的全部内容。希望您理解了这个主题。请使用评论框进行任何查询。
您可以从我们的GitHub存储库查看完整的Python脚本和更多Python示例。
参考:官方文档
Source:
https://www.digitalocean.com/community/tutorials/python-super