Python 中的多重继承 - TypeError“缺少 1 个必需的位置参数”

问题描述 投票:0回答:1

我才真正开始掌握 OOP,并且一直在研究多重继承。我遇到的问题是,当我实例化从多个类继承的类

Hybrid
时,出现以下错误:

Traceback (most recent call last):
  File "multi_inherit.py", line 44, in <module>
    hawk = Hybrid('hawk', 200, 650)
  File "multi_inherit.py", line 35, in __init__
    Archer.__init__(self, name, arrows)
  File "multi_inherit.py", line 13, in __init__
    super().__init__(name)
TypeError: Wizard.__init__() missing 1 required positional argument: 'power'

其他课程工作得很好。

class User:
    def __init__(self, name):
        self.name = name

    def greet(self):
        return f"Welcome, {self.name.title()}."


class Archer(User):
    def __init__(self, name, arrows):
        super().__init__(name)
        self.arrows = arrows

    def shoot_arrow(self):
        self.arrows -= 1
        return "You shot an arrow!"

    def arrows_left(self):
        return f"You have {self.arrows} arrows remaining."


class Wizard(User):
    def __init__(self, name, power):
        super().__init__(name)
        self.power = power

    def cast_spell(self):
        return f"You cast a spell with a power of {self.power}"


class Hybrid(Archer, Wizard):
    def __init__(self, name, arrows, power):
        Archer.__init__(self, name, arrows)
        Wizard.__init__(self, name, power)

    def powerful(self):
        return "Hybrids are super powerful!"


merlin = Wizard('merlin', 1000)
robin = Archer('robin', 150)
hawk = Hybrid('hawk', 200, 650)

print(merlin.greet())
print(merlin.cast_spell())

print(robin.arrows_left())
print(robin.shoot_arrow())
print(robin.arrows_left())
python oop typeerror multiple-inheritance
1个回答
1
投票

您现在拥有的类不太适合在多重继承中使用。当使用多重继承时,我更喜欢让构造函数同意相同的约定(使用相同的参数)或根本不使用参数。这里

powers
arrows
不同,这使得调用每个构造函数变得很尴尬。

IMO 设计此类的更好方法是 mixins。 mixins 没有构造函数,并且依赖于扩展它们的类中存在的特定值。

混合示例:

class UserMixin:
    name: str

    def greet(self):
        return f"Welcome, {self.name.title()}."


class ArcherMixin(UserMixin):
    arrows: int

    def shoot_arrow(self):
        self.arrows -= 1
        return "You shot an arrow!"

    def arrows_left(self):
        return f"You have {self.arrows} arrows remaining."


class WizardMixin(UserMixin):
    power: int

    def cast_spell(self):
        return f"You cast a spell with a power of {self.power}"

实施示例:

class User(UserMixin):
    def __init__(self, name):
        self.name = name


class Archer(ArcherMixin):
    def __init__(self, name, arrows):
        self.name = name
        self.arrows = arrows


class Wizard(WizardMixin):
    def __init__(self, name, power):
        self.name = name
        self.power = power


class Hybrid(ArcherMixin, WizardMixin):
    def __init__(self, name, arrows, power):
        self.name = name
        self.arrows = arrows
        self.power = power

    def powerful(self):
        return "Hybrids are super powerful!"

使用示例:

merlin = Wizard('merlin', 1000)
robin = Archer('robin', 150)
hawk = Hybrid('hawk', 200, 650)

print(merlin.greet())
print(merlin.cast_spell())

print(robin.greet())
print(robin.arrows_left())
print(robin.shoot_arrow())
print(robin.arrows_left())

print(hawk.greet())
print(hawk.cast_spell())
print(hawk.arrows_left())
print(hawk.shoot_arrow())
print(hawk.arrows_left())
Welcome, Merlin.
You cast a spell with a power of 1000
Welcome, Robin.
You have 150 arrows remaining.
You shot an arrow!
You have 149 arrows remaining.
Welcome, Hawk.
You cast a spell with a power of 650
You have 200 arrows remaining.
You shot an arrow!
You have 199 arrows remaining.
© www.soinside.com 2019 - 2024. All rights reserved.