为什么我们在 python 中的子 class 中使用 super() 方法
Why do we use the super() method in a child class in python
所以在 python 中调用子 class 中的父函数 class 我们使用 super()
方法但是为什么我们使用 super()
当我们可以调用 Parent class 函数时假设我有一个 Class Employee:
并且我有另一个 class 继承自 Employee class class Programmer(Employee):
来调用任何程序员 class 中员工 class 的功能我可以只使用 Employee.functionName()
就可以完成工作。
这是一些代码:
class Person:
country = "India"
def takeBreath(self):
print("I am breathing...")
class Employee(Person):
company = "Honda"
def getSalary(self):
print(f"Salary is {self.salary}")
def takeBreath(self):
print("I am an Employee so I am luckily breathing...")
class Programmer(Employee):
company = "Fiverr"
def getSalary(self):
print(f"No salary to programmer's.")
def takeBreath(self):
Employee().takeBreath()
print("I am a Programmer so i am breathing++..")
p = Person()
p.takeBreath()
e = Employee()
e.takeBreath()
pr = Programmer()
pr.takeBreath()
如您所见,我想在 Programmer()
class 中调用 Employee 函数 takeBreath()
方法,所以我只写了 Employee.takeBreath()
,它也可以完成这项工作谁能解释一下为什么我们需要 python 中的 super()
方法?
:)
super()
是一种更为通用的方法。假设您决定更改您的超类。也许您将其命名为 Tom
而不是 Employee
。现在,您必须着手更改对 Employee
通话的每一次提及。
您可以将 super()
视为获取超类的“代理”,而不管它是什么。它使您能够编写更灵活的代码。
虽然,你做的是不同的。您每次都在创建一个新的 Employee 实例,然后调用它的方法。如果您将 takeBreath
方法更改为不采用 self
参数,您将能够执行类似 Employee.takeBreath()
或更好的操作 super().takeBreath()
.
有了 super()
,您不需要在每个 class 中定义 takeBreath()
继承自 Person()
class。
关于为什么您的代码不起作用,您已经得到了一些答案(您正在创建一个新的 Employee
而不是使用您自己的 [=14= 调用 Employee
的方法]) 以及为什么通过 super
委托很方便(如果更新父 class,则不必更新所有代码)。
另一个原因是Python支持多重继承,而显式委托根本无法与钻石继承[=40=一起工作] 模式。
菱形图案是这样的:
A
/ \
/ \
B C
\ /
\ /
D
class A:
def foo(self):
...
class B(A):
def foo(self):
...
class C(A):
def foo(self):
...
class D(C, B):
def foo(self):
...
“D”扩展了“B”和“C”,并且还覆盖了“foo”以添加自己的内容。 “D”不能只调用“B::foo”和“C::foo”:如果这样做,那么 both 将依次调用“A::foo”,它将被调用两次,如果它有危险的副作用,则会产生潜在的不良影响。
如果使用super()
,则Python使用方法解析顺序管理链(特别是C3):当classes 被创建,它生成所有父 classes 的 linear 序列,并且在调用 super()
时它只是简单地从它所在的位置遍历该序列找到“父”方法,即使在完全不相关的 classes.
之间也是如此
这里的 MRO 是 D -> C -> B -> A,所以当 D
调用 super().foo()
时,Python 将调用 C::foo
,其超会打电话给 B::foo
*尽管 C 和 B 彼此不认识。
所以在 python 中调用子 class 中的父函数 class 我们使用 super()
方法但是为什么我们使用 super()
当我们可以调用 Parent class 函数时假设我有一个 Class Employee:
并且我有另一个 class 继承自 Employee class class Programmer(Employee):
来调用任何程序员 class 中员工 class 的功能我可以只使用 Employee.functionName()
就可以完成工作。
这是一些代码:
class Person:
country = "India"
def takeBreath(self):
print("I am breathing...")
class Employee(Person):
company = "Honda"
def getSalary(self):
print(f"Salary is {self.salary}")
def takeBreath(self):
print("I am an Employee so I am luckily breathing...")
class Programmer(Employee):
company = "Fiverr"
def getSalary(self):
print(f"No salary to programmer's.")
def takeBreath(self):
Employee().takeBreath()
print("I am a Programmer so i am breathing++..")
p = Person()
p.takeBreath()
e = Employee()
e.takeBreath()
pr = Programmer()
pr.takeBreath()
如您所见,我想在 Programmer()
class 中调用 Employee 函数 takeBreath()
方法,所以我只写了 Employee.takeBreath()
,它也可以完成这项工作谁能解释一下为什么我们需要 python 中的 super()
方法?
:)
super()
是一种更为通用的方法。假设您决定更改您的超类。也许您将其命名为 Tom
而不是 Employee
。现在,您必须着手更改对 Employee
通话的每一次提及。
您可以将 super()
视为获取超类的“代理”,而不管它是什么。它使您能够编写更灵活的代码。
虽然,你做的是不同的。您每次都在创建一个新的 Employee 实例,然后调用它的方法。如果您将 takeBreath
方法更改为不采用 self
参数,您将能够执行类似 Employee.takeBreath()
或更好的操作 super().takeBreath()
.
有了 super()
,您不需要在每个 class 中定义 takeBreath()
继承自 Person()
class。
关于为什么您的代码不起作用,您已经得到了一些答案(您正在创建一个新的 Employee
而不是使用您自己的 [=14= 调用 Employee
的方法]) 以及为什么通过 super
委托很方便(如果更新父 class,则不必更新所有代码)。
另一个原因是Python支持多重继承,而显式委托根本无法与钻石继承[=40=一起工作] 模式。
菱形图案是这样的:
A
/ \
/ \
B C
\ /
\ /
D
class A:
def foo(self):
...
class B(A):
def foo(self):
...
class C(A):
def foo(self):
...
class D(C, B):
def foo(self):
...
“D”扩展了“B”和“C”,并且还覆盖了“foo”以添加自己的内容。 “D”不能只调用“B::foo”和“C::foo”:如果这样做,那么 both 将依次调用“A::foo”,它将被调用两次,如果它有危险的副作用,则会产生潜在的不良影响。
如果使用super()
,则Python使用方法解析顺序管理链(特别是C3):当classes 被创建,它生成所有父 classes 的 linear 序列,并且在调用 super()
时它只是简单地从它所在的位置遍历该序列找到“父”方法,即使在完全不相关的 classes.
这里的 MRO 是 D -> C -> B -> A,所以当 D
调用 super().foo()
时,Python 将调用 C::foo
,其超会打电话给 B::foo
*尽管 C 和 B 彼此不认识。