Python OOP 中作为方法参数的对象

Object as parameter of a method in Python OOP

我正在尝试构建一个简单的 RPG 游戏以了解有关 Python 中 classes 的更多信息,但我在战斗方法上遇到了困难。这个想法是在创建玩家和怪物之后,方法fight将有参数enemy,即玩家正在战斗的怪物。

这是我在 fight 中所做的(它在 Player 的 class 中)方法:

def fight(self, enemy):
        self.enemy = enemy
        d20 = Dice(20)
        if d20.roll() >= enemy.armor_class:
            print("You hitted %s" % enemy.name)
            enemy.hp -= self._strength
            print("\n%s has %d hp left" % (enemy.name, enemy.hp))
        else:
            print("you missed")

这是我现在正在进行的调用(在主文件中):

player = Fighter()
goblin = Enemy("Goblin", 10, 10, 1, 5)

player.fight(goblin)

但是,每当我 运行 它时,我都会收到以下错误:

TypeError: fight() takes 1 positional argument but 2 were given

classes(PlayerEnemy) 都继承自 Character's class,那么这个错误是怎么回事?我需要来自敌人的 import 来解决这个问题吗?

EDIT1 : 以上完整 Player class:

class Player(Character):
    def __init__(self, armor_class):
        super().__init__(input("Tell us your name, hero:\n>"), 20, 10, {}, armor_class, 1)
        self.exp = 0
        self._strength = 0
        self._constitution = 0
        self._dexterity = 0
        self._intelligence = 0
        self._wisdom = 0
        self._charisma = 0

    def fight(self, enemy):
        self.enemy = enemy
        d20 = Dice(20)
        if d20.roll() >= enemy.armor_class:
            print("You hitted %s" % enemy.name)
            enemy.hp -= self._strength
            print("\n%s has %d hp left" % (enemy.name, enemy.hp))
        else:
            print("you missed")

    def __str__(self):
        str_info = "\tName: [%s]\tLEVEL: %d\n\tHP: %2d\t\tMP: %2d\n" % (self.name, self.lvl, self.hp, self.mp)
        str_stats = "\t\tSTR: %2d\n\t\tCON: %2d\n\t\tDEX: %2d\n\t\tINT: %2d\n\t\tWIS: %2d\n\t\tCHA: %2d\n" % (
            self._strength, self._constitution, self._dexterity, self._intelligence, self._wisdom,
            self._charisma)
        return str_info + str_stats

Fighter class:

class Fighter(Player):
    """
    Fighter class, a strong warrior that uses meele attacks to face his opponents
    """

    def __init__(self):
        super().__init__(armor_class=10)
        self._strength += 2

    def fight(self):
        super().fight()

    def __str__(self):
        return super().__str__()

而我的实际 Enemy class:

class Enemy(Character):
    def __init__(self, name, hp, mp, lvl, atk):
        super().__init__(name, hp, mp, {}, 10, lvl)
        self.atk = atk

我的main.py如下

from fighter import Fighter
from enemy import Enemy

player = Fighter()
goblin = Enemy("Goblin", 10, 10, 1, 5)

player.fight(goblin)

Fighter.fight 中,您正在使用 super().fight() 来实例化一个新的 Player 对象并在这个新实例上调用 fight()。使用 self.fight() 调用 Fighter 实例上的方法。

切勿使用 super() 访问超类 class 的方法。 您是从那个 class 继承的,因此来自超类的所有方法class 在子class 范围内可用。 super()的目的是调用超class的构造函数(__init__()).

编辑:实际上可以使用 super().method() 访问来自 superclass 的方法。这里的问题是 fight() 方法的参数数量错误。 (见下面的评论)