2014-01-11 5 views
0

Я пытаюсь вызвать неопределенную именованную функцию из другого класса. Я имею в виду внешний вход или переменную в цикле как имя функции.Вызов неуказанной функции из другого файла и другого класса

Например,

class options(object): 

    def functionOne(): # or function1 
     pass 
    def functionTwo(): # or function2 
     pass 
    def functionThree(): # or function3 
     pass 

в файле options.py и:

class main(object): 

    def runSomething(): 

     options=options() 
     while counter<=3: 
      options.function**"a"**() 
      counter = counter+1 

или:

class main(object): 

    def runSomething(): 

     options=options() 
     num=raw_input("number: ") 

     options.function**"num"**() 

в main.py.

Что я должен делать в жирных местах? Есть ли способ объединить имя функции и номер для вызова функции.

Я искал решение этой проблемы в течение нескольких дней, но я не могу найти подходящего решения.

+0

Я не рекомендую вам иметь переменную с тем же именем класса ('options') – Christian

+0

вы правы, я написал неожиданно эти примеры, я просто пропустил. Спасибо четыре вашего предложения. – Archaeon

+0

Вы не можете называть любой из этих методов, потому что они обычные методы экземпляра, но не имеют параметра 'self' ... – abarnert

ответ

1
class Options(object): 
    def functionOne(self): # or function1 
     print 'one' 
    def functionTwo(self): # or function2 
     print 'two' 
    def functionThree(self): # or function3 
     print 'three' 

o = Options() 
for name in dir(o): 
    if 'function' in name: 
     getattr(o, name)() 

При выполнении приведенные выше результаты в:

one 
three 
two 

запустить функцию выборочно дано частичное название:

def run_it(o, partial): 
    for name in dir(o): 
     if partial in name: 
      getattr(o, name)() 

Это может быть использовано в качестве:

>>> run_it(o, 'One') 
one 
>>> run_it(o, 'nTwo') 
two 
3

Вот один подход:

function_num = getattr(options, 'function'+str(num)) 
function_num() 

Это использует встроенную функцию getattr. getattr(a, 'b') эквивалентен a.b, где a - это некоторый объект, а b - это некоторый атрибут этого объекта.

+0

Это основной метод, который я ищет ** точно **. Большое вам спасибо за ваш интерес. – Archaeon

2

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