j_y*_*rbe 3 python oop inheritance python-3.x
我正在修改Python中的OOP,并尝试从另一个子类继承属性,但我不知道如何或是否可能。这是我到目前为止所拥有的:
class Employee:
def __init__(self, first, last, pay):
self.first = first
self.last = last
self.pay = pay
def increase_pay(self, multiplier):
self.pay = int(self.pay * multiplier)
class Developer(Employee):
def __init__(self, first, last, pay, prog_lang):
Employee.__init__(self, first, last, pay)
self.prog_lang = prog_lang
self.email = first.lower() + '.' + last.lower() + '@outlook.com'
class BetaTester(Employee, Developer):
def __init__(self, first, last, pay, prog_lang, platform):
self.platform = platform
Run Code Online (Sandbox Code Playgroud)
我收到的错误是:
Traceback (most recent call last):
File "main.py", line 33, in <module>
class BetaTester(Employee, Developer):
TypeError: Cannot create a consistent method resolution
order (MRO) for bases Employee, Developer
Run Code Online (Sandbox Code Playgroud)
che*_*ner 10
方法解析顺序(MRO)是由C3线性化算法定义的,这听起来很复杂,但实际上可以归结为:类、它的父类、它们的父类等需要放置在一个列表中,并且满足两个条件:
class声明中的顺序相同。也就是说,给定 的class A(B, C, D)MROA将在B之前C,这将在 之前D。(A,当然,出现在所有 3 之前)您应该能够看到问题:通过该算法,根据第一个规则,MROBetaTester必须包含Developer在之前,但根据第二个规则,必须包含在之前。在这种情况下,您可以简单地交换两者来解决问题,但是没有任何理由从一个类继承并从其继承另一个类。干脆彻底放弃吧。EmployerEmployerDeveloperA AA
# Developer is already a descendent of Employee, so BetaTester will be, too
class BetaTester(Developer):
...
Run Code Online (Sandbox Code Playgroud)
为了确保__init__调用每个类的方法,请使用super确保每个类的方法都__init__调用链中的下一个方法。这里最重要的规则是确保如果一个类添加参数__init__,它必须确保不将它们传递给下一个类__init__。同时,它必须接受任意关键字参数并确保传递它们。关键字参数使您可以更轻松地关注需要处理的参数,并传递不需要处理的参数。
class Employee:
def __init__(self, first, last, pay, **kwargs):
super().__init__(**kwargs)
self.first = first
self.last = last
self.pay = pay
def increase_pay(self, multiplier):
self.pay = int(self.pay * multiplier)
class Developer(Employee):
def __init__(self, prog_lang, **kwargs):
super().__init__(**kwargs)
self.prog_lang = prog_lang
self.email = "{}.{}@outlook.com".format(self.first.lower(), self.last.lower())
class BetaTester(Developer):
def __init__(self, platform, **kwargs):
super().__init__(**kwargs)
self.platform = platform
b = BetaTester(first="Bob", last="Jones", pay=90000, prog_lang="Python", platform="Unix")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6932 次 |
| 最近记录: |