2015-09-16 1 views
1

Я пытаюсь передать параметр функции, которую я хочу вызвать из экземпляра класса, но я понятия не имею, как это сделать. Я могу сделать это просто отлично, если я не пройду никаких параметров, но второй, я начинаю передавать параметры, все это взрывается мне в лицо.В python 27 Как передать метод с аргументами в __init __() класса?

Вот пример того, что я хочу сделать.

class foo: 
    def __init__(self, use_function=None): 
     self.use_function = use_function 

    def call(self): 
     self.use_function() 

def bar(number): 
    print 'number is ' + str(number) 

myObj = foo(use_function=bar(15)) 

myObj.call() 
+0

Что значит «это взрывается мне в лицо»? Что вы ожидаете от этого примера, и что он делает? – BrenBarn

ответ

3

Вы не можете передавать аргументы, потому что ваша __init__ функция не принимает аргументов, он просто принимает функцию. Если вы проходите bar(15), он вызывает barперед__init__ и __init__ принимает значение возврата из bar(15) (который в данном случае не является None).

Если вы хотите получить __init__ по телефону bar(15), вы можете сделать foo(use_function=lambda: bar(15)). Это перейдет в __init__ функцию zero-argumenbt, которая при вызове вызовет bar(15).

+0

Спасибо! Это сработало! Теперь мне нужно будет выяснить, что вы только что сделали, чтобы я мог понять это, прежде чем добавлять его в свой код. :) –

1
class foo: 
    def __init__(self, use_function=None,params=None): 
     self.use_function = use_function 
     self.params = params 

    def call(self): 
     self.use_function(self.params) 

def bar(number): 
    print 'number is ' + str(number) 

myObj = foo(use_function=bar, params=15) 

myObj.call() 
+1

Если вы хотите поддерживать несколько параметров (а не только один вводящий в заблуждение имена с множественным числом), вы, вероятно, захотите сделать 'self.use_function (* self.params)' в 'call' и передать' params = (15,) '(одноэлементный набор) в конструктор' foo'. – Blckknght

1
class foo: 
    def __init__(self, use_function=None): 
     self.use_function = use_function 

    def call(self): 
     eval(self.use_function) 

def bar(number): 
    print 'number is ' + str(number) 

myObj = foo(use_function="bar(15)") 

myObj.call() 

Если вы хотите передать параметр в функцию, когда передать функцию init, вы можете передать строку как bar(15), то место, где вы хотите, чтобы вызвать функцию, просто используйте встроенный функция eval

1

вы можете вернуть значение, которое вы печатаете в баре()

class foo: 
    def __init__(self,use_func=None): 
    self.u = use_func 
    def call(self): 
    print self.u 

def bar(n): 
return n 

myobj = foo(use_func=bar(15)) 
myobj.call() 

Все потому, что вы ничего не проходящее от bar() myobj получает None

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