为什么我们在 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 彼此不认识。