如何解决为什么我们在python的子类中使用super()方法 :)
所以在 python 中调用子类中的父类函数,我们使用 super()
方法,但是当我们可以调用父类函数时为什么我们使用 super()
假设我有一个 { {1}} 和我有另一个类继承自 Employee 类 Class Employee:
来调用 Programmer 类中的 Employee 类的任何函数,我可以只使用 class Programmer(Employee):
并完成这项工作。
这是一些代码:
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()
类中调用 Employee 函数 takeBreath()
方法,所以我只编写了 Programmer()
,它也可以完成这项工作,所以任何人都可以解释我为什么需要python 中的 Employee.takeBreath()
方法?
:)
解决方法
使用 super()
,您不需要在从 takeBreath()
类继承的每个类中定义 Person()
。
super()
是一种更通用的方法。假设您决定更改超类。也许您将其命名为 Tom
而不是 Employee
。现在,您必须更改每次提到的 Employee
调用。
您可以将 super()
视为获取超类的“代理”,而不管它是什么。它使您能够编写更灵活的代码。
不过,你在做什么是不同的。您每次都在创建 Employee 的一个新实例,然后在其上调用该方法。如果您将 takeBreath
方法更改为不采用 self
参数,您将能够执行类似 Employee.takeBreath()
或更好的 super().takeBreath()
之类的操作。
您已经得到了一些关于为什么您的代码不起作用的答案(您正在创建一个新的 Employee
,而不是使用您自己的 Employee
调用 self
的方法)以及为什么通过 super
进行委托很方便(如果您更新父类,则不必更新所有代码)。
另一个原因是 Python 支持多重继承,而显式委托根本无法与菱形继承模式一起工作。
菱形图案是这样的:
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)来管理链:当创建类时,它会生成一个线性 所有父类的序列,当调用 super()
时,它只是从它所在的位置遍历该序列以找到“父”方法,即使在完全不相关的类之间也是如此。
这里的 MRO 将是 D -> C -> B -> A,所以当 D
调用 super().foo()
时,Python 将调用 C::foo
,其 super 将调用 {{1} } *尽管 C 和 B 彼此不了解。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。