2014-02-13 2 views
0

В JavaScript у меня есть несколько разных модулей (объектов) с функцией «один».Вызов определенной функции для любого модуля/объекта

test_module1 = { 
    one: function() { 
     alert('fun mod1_one successful'); 
    }, 
    two: function() { 
     alert('fun mod1_two successful'); 
    } 
} 
test_module2 = { 
    one: function() { 
     alert('fun mod2_one successful'); 
    }, 
    two: function() { 
     alert('fun mod2_two successful'); 
    } 
} 

workingObj = test_module1; 
workingObj["one"](); 

Теперь, если у меня есть один из этих модулей/объектов в переменной «workingObj» и я хочу вызвать функция «один» на этом объекте, я называю workingObj [ «один»](); ,

В настоящее время я изучаю Python. На этом языке что-то похожее?

Мне нужно решение без классов Python/наследование.

Большое спасибо заранее

Вольфганг

+0

Любая конкретная причина вы не используете 'workingObj.one()'? Вы не знаете, какой метод вы будете называть заранее? – user2357112

+0

Здравствуйте, user2357112! В некоторых ситуациях я знаю имя функции, в другом я не знаю. –

ответ

4

Абсолютно! Все, что вам нужно сделать, это воспользоваться «getattr» и выполните следующие действия

class MyObj(object): 
    def func_name(self): 
     print "IN FUNC!" 

my_obj = MyObj() 

# Notice the() invocation 
getattr(my_obj, "func_name")() # prints "IN FUNC!" 
+0

Привет, Брайан! Как будет выглядеть «my_obj» в Python? Спасибо –

+0

А я сожалею, что вам нужен больше контекста, я обновил ответ соответственно – Bryan

+0

'getattr' может быть излишним. Скорее всего, все, что вам нужно, это 'my_obj.func_name()'. – user2357112

1

Вы можете использовать oprerator.methodcaller

from operator import methodcaller 
call_one = methodcaller("one") 

Теперь вы можете использовать get_one, чтобы получить one от любого объекта и назвать его как это

call_one(obj) 

преимущество над getattr

Помимо того, что он очень читабельен и идиоматичен, вам не нужно звонить methodcaller для каждого объекта, в отличие от getattr. Создайте один раз и используйте его столько, сколько хотите, столько объектов, сколько хотите.

Например,

class MyClass1(object): # Python 2.x new style class 
    def one(self): 
     print "Welcome" 

class MyClass2(object): # Python 2.x new style class 
    def one(self): 
     print "Don't come here" 

from operator import methodcaller 
call_one = methodcaller("one") 

obj1, obj2 = MyClass1(), MyClass2() 
call_one(obj1) # Welcome 
call_one(obj2) # Don't come here 
+1

Если вы собираетесь использовать 'operator', почему бы не' operator.methodcaller'? – user2357112

+0

@ user2357112 Спасибо, человек :) Я не знал, что он существует. Обновлен мой ответ. :) – thefourtheye

Смежные вопросы