我正在用Python 3制作一个基于文本的冒险游戏,我需要为不同的敌人类型制作类。每种敌人类型将有 5 个属性(当前生命值、最大生命值、攻击力、速度和准确性(。我想知道是否有任何方法可以制作这些类,而不必编写几个包含相同属性声明的 init,如果这有意义的话。所以我可以有一个超类或包含这个__init__
的东西
def __init__(self, hp, attack, speed, accuracy):
#defines stats for the enemy
self.maxhp = hp
self.currenthp = hp
self.attack = attack
self.speed = speed
self.accuracy = accuracy
只需将其"复制"到不同的敌人类型类别中即可。有没有办法做到这一点,或者我必须为每个敌人类型键入一个包含此 init 的不同超类?
对于你所描述的内容,你实际上不需要子类,你可以只是Enemy
类的不同实例。如果确定具有多个类,则可以将这些属性烘焙到__init__
方法中。这是两个选项...
实例
class Enemy:
def __init__(self, hp, attack, speed, accuracy):
self.hp = hp
self.attack = attack
self.speed = speed
self.accuracy = accuracy
Warrior = Enemy(100, 5, 7, 6)
Dragon = Enemy(500, 8, 2, 4)
子
class Enemy:
def __init__(self, hp, attack, speed, accuracy):
self.hp = hp
self.attack = attack
self.speed = speed
self.accuracy = accuracy
class Warrior(Enemy):
def __init__(self):
super().__init__(100, 5, 7, 6)
class Dragon(Enemy):
def __init__(self):
super().__init__(500, 8, 2, 4)
我希望这能回答你的问题。我会做第一种方法,直到我真的需要更多特定于每个类的函数。从一开始,我就不确定Dragon
还能比Enemy
更具体地做什么。如果您感到困惑,请在下面发表评论。
编辑:刚刚想到了第三件事,你可以做第三件事作为实例化方法的修改。
实例化方法的问题在于,如果你想要一种类型的多个,那么你必须不断用它们的"Enemy"属性重新声明它们。但是,您可以使用__call__
方法避免这种情况。
class Enemy:
def __init__(self, hp, attack, speed, accuracy):
self.hp = hp
self.attack = attack
self.speed = speed
self.accuracy = accuracy
def __call__(self):
return Enemy(self.hp, self.attack, self.speed, self.accuracy)
Warrior = Enemy(100, 5, 7, 6)
Dragon = Enemy(500, 8, 2, 4)
然后,您可以在不使用Enemy(...)
的情况下创建Warrior
或Dragon
的新实例:
warrior1 = Warrior()
warrior2 = Warrior()
dragon1 = Dragon()
assert warrior1 is not warrior2
assert dragon1 is not Dragon
assert isinstance(dragon1, Enemy)
据我了解,你想要一个超职业"敌人",对于"敌人"的每个子职业,你想要例如"战士"、"龙"、"骑士"; 每个敌人都有生命值、攻击力、准确性属性,但勇士的属性和方法可能与飞行龙不同。在这种情况下,我会看看这篇关于继承的文章。继承允许您只创建一个超类,并让每个子类"继承"这些属性: https://www.w3schools.com/python/python_inheritance.asp
前任:
class Subclass(Superclass):
def __init__(self, SubclassAttribute1, SubclassAttribute2):
super().__init__(SuperclassAttribute1, SuperclassAttribute2)