Вызов функции класса с использованием вызова переменной функции

avatar
Dylan Grove
8 апреля 2018 в 03:00
46
2
0

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

Моя попытка была такой: AssignClass.[self.Class](self)

но очевидно, что синтаксис не имеет смысла

class Creature:

    def __init__(self, Name, Class):

        self.Name   = Name
        self.Class  = Class

        # Using a variable function call to remove
        # the need for a ton of 'if' statements

        AssignClass.[self.Class](self)

        # Basically automate doing this:

        if self.Class = "Orc":
            AssignClass.Orc(self)
        elif self.Class = "Wizard"
            AssignClass.Wizard(self)


class AssignClass:

    def Orc(Creature):
        Creature.Class='Orc'
        Creature.Health=100
        Creature.Mana=0

    def Wizard(Creature):
        Creature.Class='Wizard'
        Creature.Health=75
        Creature.Mana=200

Evil_Wizard = Creature("Evil Wizard", "Wizard")
Источник

Ответы (2)

avatar
zwer
8 апреля 2018 в 03:14
2

Вы можете получить методы класса, используя getattr(), а затем просто передать свой экземпляр Creature, например:

class Creature:

    def __init__(self, Name, Class):
        self.Name   = Name
        self.Class  = Class
        getattr(AssignClass, Class)(self)

Кстати. это все, кроме рекомендуемого стиля для классов Python, наименьший из которых заключается в том, что вы затеняете класс Creature в своем AssignClass (который не должен быть классом в первую очередь). Я рекомендую вам внимательно прочитать PEP 8 — Руководство по стилю для кода Python.

Dylan Grove
8 апреля 2018 в 03:20
0

Думаю, я достаточно долго откладывал изучение PEP 8. Я просто программирую для удовольствия, поэтому все, что я делаю, не имеет значения, ха-ха. Спасибо за ответ.

avatar
Dylan Grove
8 апреля 2018 в 03:14
0

Поиграл еще немного и обнаружил, что для этого можно использовать eval. (Безопасно, так как здесь нельзя добавить пользовательский ввод)

class Creature:

    def __init__(self, Name, Class):

        self.Name   = Name
        self.Class  = Class

        eval('AssignClass.'+Class)(self)