Это действительно то же самое, что и динамическое создание и доступа к переменным, даже если эти переменные являются функциями, а не целыми числами. См. Keep data out of your variable names и Why you don't want to dynamically create variables для некоторой идеи, почему это, как правило, плохая идея.
Теперь, если у этих функций были полезные имена, которые вы на самом деле вызывали статически в своем коде, это будет другая история. Но тот факт, что они называются function1
, function2
и т. Д. И что вы хотите назвать их каким-то образом похожим на options.function**"num"**()
, подразумевает, что это именно так.
Итак, ответ такой же, как и в другом месте: поставьте вещи в list
или dict
и посмотрите их там.
Тот факт, что забыл дать эти вещи, чтобы иметь параметр self
, подразумевает, что вы только переполняли их в class
, чтобы где-то их хранить. В этом случае ... почему бы просто не сохранить их в списке в первую очередь? Например:
class Options(object):
functions = []
def function1(self): pass
functions.append(function1)
def function2(self): pass
functions.append(function2)
def function3(self): pass
functions.append(function3)
class main(object):
def runSomething():
options=Options()
for counter in range(3):
options.functions[counter]()
Конечно, вы не хотите повторить себя, набрав function1
в определении, а затем снова в functions.append
. Как вы можете это решить?С декоратором. Это может быть слишком сложным для вас, чтобы разобраться по своему усмотрению, и детали будут зависеть от того, как вы действительно хотите использовать эти вещи (что непонятно из вашего вопроса, учитывая эти методы - без определения self
), но как только вы получите представление, что это очень гибкий и не так уж трудно:
_optfunctions = []
class Options(object):
functions = _optfunctions
def add(func):
_optfunctions.append(func)
return func
@add
def function1(self): pass
@add
def function2(self): pass
@add
def function3(self): pass
del add
del _optfunctions
Я не рекомендую вам иметь переменную с тем же именем класса ('options') – Christian
вы правы, я написал неожиданно эти примеры, я просто пропустил. Спасибо четыре вашего предложения. – Archaeon
Вы не можете называть любой из этих методов, потому что они обычные методы экземпляра, но не имеют параметра 'self' ... – abarnert