2014-01-11 90 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 namesWhy you don't want to dynamically create variables瞭解爲什麼這通常是一個壞主意。

現在,如果這些函數具有實際上要在代碼中靜態調用的有用名稱,那將是一個不同的故事。但事實上,他們被稱爲function1,function2等,並且您想以某種方式調用它們,類似於options.function**"num"**(),這意味着情況正是如此。

所以,答案與其他任何地方的答案相同:將東西放入listdict,然後從那裏查找它們。

是忘了給這些東西有一個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]() 

你當然不希望通過在functions.append在定義輸入function1,然後再重複自己。你怎麼解決這個問題?隨着裝飾。這可能有點太高級了,你不能自己想出來,細節將取決於你實際上想要如何使用這些東西(從你的問題中不清楚,給定了這些方法 - 沒有定義),但是一旦你的想法是非常靈活,並不難:

_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