Je pense que ton approche n’est pas la bonne : tu ne devrais pas laisser l’utilisateur accéder à ce qu’il veut juste à partir d’une saisie clavier (parce qu’il ne doit pas forcément accéder à tous les détails d’implémentation, entrer un nom qui n’existe pas, mais qu’il doit savoir qu’elles sont ses options etc.).
Je te suggère de plutôt construire une liste d’options automatiquement en "taggant" les attributs et méthodes auxquels tu veux donner accès. Qui plus est, si tu maîtrises la façon dont tu définis les propriétés accessibles, tu peux mieux gérer les mécanismes d’appels
Une approche très grossière :
class Menu:
_inputs = list()
@classmethod
def display(cls):
print('Choices:')
for option in cls._inputs:
print(option.name)
@classmethod
def execute(cls, name):
for option in filter(lambda option: option.name == name, cls._inputs):
option.call()
@classmethod
def registerMethod(cls, func):
input = MenuAttribute(func.__name__, func)
cls._inputs.append(input)
return func
@classmethod
def registerAttribute(cls, object, name, value=None):
setattr(object, name, value)
input = MenuAttribute(name, lambda: print(getattr(object, name)))
cls._inputs.append(input)
class MenuAttribute:
def __init__(self, name, call):
self.name = name
self.call = call
class A:
def __init__(self):
Menu.registerAttribute(self, "foo", "this is foo")
self.bar = "this is bar"
pass
@Menu.registerMethod
def foobar():
print("In foobar()")
if __name__ == "__main__":
a = A()
Menu.display()
selection = input("> ")
Menu.execute(selection)