Создание нескольких классов с разными значениями для их атрибутов: есть ли способ избежать создания нескольких __init__? - PullRequest
0 голосов
/ 22 декабря 2019

Я делаю текстовую приключенческую игру на Python 3, и мне нужно создавать классы для разных типов врагов. Каждый тип врага будет иметь 5 атрибутов (текущая мощность, максимальная мощность, атака, скорость и точность). Мне интересно, есть ли какой-нибудь способ сделать эти классы без необходимости писать несколько блоков, содержащих одинаковые объявления атрибутов , если это имеет смысл. Таким образом, я мог бы иметь суперкласс или что-то, содержащее это __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 для каждого типа врага?

Ответы [ 2 ]

0 голосов
/ 22 декабря 2019

Для того, что вы описали, вам на самом деле не нужно подклассов, вы можете просто иметь разные экземпляры класса 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. Прокомментируйте ниже, если вы запутались.


Редактировать : Просто подумайте о третьей вещи, которую вы могли бы сделать как модификацию метода создания экземпляров.

Проблема с методом создания экземпляров состоит в том, что если вы хотите использовать несколько типов одного типа, вам придется продолжать повторное выделение их с их атрибутами «Враг». Но вы можете избежать этого, используя метод __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)

И затем вы можете создавать новые экземпляры Warrior или Dragon без использования Enemy(...):

warrior1 = Warrior()
warrior2 = Warrior()
dragon1 = Dragon()

assert warrior1 is not warrior2
assert dragon1 is not Dragon
assert isinstance(dragon1, Enemy)
0 голосов
/ 22 декабря 2019

Как я понимаю, вам нужен один суперкласс "Враг", а для каждого подкласса "Враг" вы хотите, например, "Воин", "Дракон", "Рыцарь";у каждого врага есть характеристики hp, атаки, точности, но у Воина могут быть другие атрибуты и методы, чем у дракона, как при полете. В этом случае я бы проверил эту статью о наследовании. Наследование позволяет вам создать только один суперкласс, и эти атрибуты «наследуются» каждым подклассом: https://www.w3schools.com/python/python_inheritance.asp

Пример:

class Subclass(Superclass):
  def __init__(self, SubclassAttribute1, SubclassAttribute2):
    super().__init__(SuperclassAttribute1, SuperclassAttribute2)
...