Запуск метода в экземпляре / объекте, имя которого зависит от ввода из метода другого экземпляра

#python #class #methods #instance

#python #класс #методы #экземпляр

Вопрос:

У меня есть класс Node, который принимает переменное количество аргументов ключевого слова, представляющих варианты, которые может выбрать игрок, и пункты назначения, которые должны быть связаны с этими вариантами. Таким образом, в зависимости от ввода пользователя должен вызываться метод play() определенного другого экземпляра узла.

 class Node:
def __init__(self, txt, **kwargs):
    self.txt = txt
    self.__dict__.update(kwargs)
    c_key, d_key = "c", "d"
    choices = [val for key, val in self.__dict__.items() if c_key in key]
    destinations = [val for key, val in self.__dict__.items() if d_key in key]
    self.choices = choices
    self.destinations = destinations
    
def play(self):
    print(self.txt)
    try:
        for c in self.choices:
            print(c)
    except:
        pass
    decision = input()
    dec = int(decision)
    for choice in self.choices:
        if choice.startswith(decision):
            self.destinations[dec-1].play() <- this obviously doesn't work


 node_0 = Node("Intro-Text", 
            c1 = "1) Choice A", 
            d1 = "node_1", 
            c2 = "2) Choice B",
            d2 = "node_2")

node_1 = Node("Text Node 1")

node_0.play()
  

Например, когда ввод пользователя равен «1», следует вызывать node_1.play(), потому что d1 = «node_1», когда ввод равен «2», node_2.play(), потому что в d2 есть 2 и так далее.

Ответ №1:

Ваш основной код, вероятно, следует изменить, чтобы передавать ссылки на узлы, а не строки, идентифицирующие узлы:

 node_1 = Node("Text Node 1")
node_2 = Node("Text Node 2")

node_0 = Node("Intro-Text", 
            c1 = "1) Choice A", 
            d1 = node_1,         # pass node reference instead of string
            c2 = "2) Choice B",
            d2 = node_2)         # pass node reference instead of string
  

Комментарии:

1. Я знал, что решение, вероятно, будет простым, но не таким простым, ха-ха. Потрясающе, спасибо!

2. @yalo, добро пожаловать. Пожалуйста, примите и поддержите ответ, если вы считаете, что он ответил на ваш вопрос и помог.