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(Player
和 Enemy
) 都继承自 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() 方法的参数数量错误。 (见下面的评论)
我正在尝试构建一个简单的 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(Player
和 Enemy
) 都继承自 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 实例上的方法。
切勿使用 您是从那个 class 继承的,因此来自超类的所有方法class 在子class 范围内可用。
super()
访问超类 class 的方法。super()
的目的是调用超class的构造函数(__init__()).
编辑:实际上可以使用 super().method()
访问来自 superclass 的方法。这里的问题是 fight() 方法的参数数量错误。 (见下面的评论)