创建多个具有不同属性值的类:有什么方法可以避免必须进行多个__init__?



我正在用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(...)的情况下创建WarriorDragon的新实例:

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)

相关内容

最新更新