📅  最后修改于: 2023-12-03 14:46:27.095000             🧑  作者: Mango
在Python中,使用super()
函数可以让我们更方便地调用父类的方法和属性,特别是在单继承的情况下。本文将详细介绍super()
函数的用法和注意事项。
super()
函数的用法super()
函数用于返回一个代理对象,可以用来访问一个类的父类的方法和属性。
class Parent:
def __init__(self):
self.propertyA = 1
def methodA(self):
print("parent's methodA")
class Child(Parent):
def __init__(self):
super().__init__()
self.propertyB = 2
def methodB(self):
super().methodA()
print("child's methodB")
child = Child()
child.methodB()
在这个例子中,Child
继承了Parent
类,并覆盖了它的__init__
方法。在Child
的__init__
方法中,我们通过super()
函数调用了Parent
的__init__
方法,并初始化了propertyA
属性。
在Child
的methodB
方法中,我们同样使用了super()
函数来调用Parent
的methodA
方法。这里的super()
函数实际上返回了一个代理对象,它包含了Child
类和它的父类Parent
的方法列表,并且能够自动识别方法调用的顺序。
因此,在我们调用super().methodA()
时,super()
函数会自动找到Parent
类中定义的methodA
方法,并进行调用。最后,Child
的methodB
方法打印了child's methodB
,完成了本次示例。
super()
函数的注意事项在使用super()
函数时,通常我们不需要再向其传递任何参数。在上面的示例中,我们就没有传递任何参数给super()
函数。这是因为,super()
函数实际上是一个无参构造函数,它使用的参数是自动推导得出的。
在Python 3中,我们也可以使用super()
函数来访问不同的父类方法,比如:
class ParentA:
def method(self):
print("ParentA's method")
class ParentB:
def method(self):
print("ParentB's method")
class Child(ParentA, ParentB):
def method(self):
super(ParentA, self).method()
child = Child()
child.method()
在这个例子中,Child
同时继承了ParentA
和ParentB
类,并重写了它们的method
方法。
在Child
的method
方法中,我们使用super(ParentA, self)
传递了一个参数ParentA
,表示我们希望调用ParentA
类中的method
方法。这样,在多重继承的情况下,我们就可以通过super()
函数来访问不同的父类方法。需要注意的是,如果使用super()
函数来访问父类方法时,父类方法的参数是自动传递的。
super()
函数的顺序在单继承的情况下,super()
函数会按照继承树中声明的顺序进行调用。
比如,在下面的例子中,我们定义了三个类A
、B
和C
,B
和C
继承自A
类:
class A:
def method(self):
print("A's method")
class B(A):
def method(self):
super().method()
print("B's method")
class C(A):
def method(self):
super().method()
print("C's method")
class D(B, C):
def method(self):
super().method()
print("D's method")
d = D()
d.method()
在这个例子中,我们定义了一个D
类,它继承自B
和C
类,并重写了method
方法。
当我们调用d.method()
时,super().method()
会首先访问B
类的method
方法,然后在其内部调用super().method()
访问A
类的method
方法;接着回到C
类的method
方法中,再次调用super().method()
访问A
类的method
方法。最后,D
类的method
方法中调用super().method()
,也就是调用C
类的method
方法。
因此,我们的输出结果是:
A's method
C's method
B's method
D's method
在Python中,我们还可以使用super()
函数来调用静态方法和类方法。需要注意的是,静态方法和类方法不需要传递self
参数,而是传递cls
参数。因此,在调用静态方法和类方法时,我们需要使用以下语法:
super().method(cls, arg1, arg2, ...)
其中,cls
表示当前类,后面的arg1
、arg2
等表示除cls
外的其他参数。
在下面的例子中,我们定义了一个类Parent
,它包含了一个静态方法static_method
和一个类方法class_method
:
class Parent:
def static_method(cls, x, y):
print(f"Parent's static_method({x}, {y})")
@classmethod
def class_method(cls, x, y):
print(f"Parent's class_method({cls.__name__}, {x}, {y})")
在Child
类中,我们使用super()
函数分别调用了Parent
类的静态方法和类方法:
class Child(Parent):
def static_method(cls, x, y):
super().static_method(cls, x, y)
print(f"Child's static_method({x}, {y})")
@classmethod
def class_method(cls, x, y):
super().class_method(cls, x, y)
print(f"Child's class_method({x}, {y})")
child = Child()
child.static_method(1, 2)
child.class_method(3, 4)
在调用child.static_method(1, 2)
时,super().static_method(cls, x, y)
会首先访问Parent
类的static_method
静态方法,传递当前类Child
、1
和2
三个参数,并输出Parent's static_method(Child, 1, 2)
;然后,Child
类的static_method
静态方法将输出Child's static_method(1, 2)
。
在调用child.class_method(3, 4)
时,super().class_method(cls, x, y)
会首先访问Parent
类的class_method
类方法,传递当前类Child
、3
和4
三个参数,并输出Parent's class_method(Child, 3, 4)
;然后,Child
类的class_method
类方法将输出Child's class_method(3, 4)
。
super()
函数在Python的单继承中是一个非常便利的方法,可以帮助我们访问父类方法和属性,而不必硬编码其类名。需要注意的是,super()
函数的调用顺序会按照继承树中声明的顺序进行,我们也可以在多重继承的情况下通过传递参数来访问不同的父类方法。此外,在结合静态方法和类方法时,我们需要传递cls
参数而不是self
参数。