2016-05-07 2 views
1

У меня есть класс, который я хочу использовать для инициализации произвольного метода для использования для синтаксического анализа строк в зависимости от контекста.Ошибка использования метода класса, определенного за пределами класса

Используя метод, определенный вне класса, как описано здесь: Python define method outside of class definition?

def my_string_method(self): 
    return self.var.strip() 

class My_Class(): 
    def __init__(self, string_method): 
     self.var = ' foo ' 
     self.string_method = string_method 

    def use_string_method(self): 
     return self.string_method() 

instance = My_Class(string_method=my_string_method) 
print instance.use_string_method() 

Я получаю ошибку «TypeError: use_string_method() takes exactly 1 argument (0 given)».

Не следует ли аргумент self неявно указывать на use_string_method? Есть ли способ определить функцию таким образом, что это происходит, или мне нужно явно передать самозапуск аргумент метод, определенные вне класса как таковые:

class My_Class(): 
    def __init__(self, string_method): 
     self.var = ' foo ' 
     self.string_method = string_method 

    def use_string_method(self): 
     return self.string_method(self) 
+0

Ой, это сложно. У меня было что-то подобное, не удалось найти обходное решение :( – linusg

ответ

1

Вы должны обернуть переданный в функции в «MethodType».

Изнутри вашего INIT:

self.string_method = types.MethodType(string_method, self) 

Это связывает метод в класс и позволяет получить неявный параметр самого. Удостоверьтесь, что вы import types в верхней части вашего скрипта.

+0

Цените это, спасибо! – Dan

+0

Другой вариант - обернуть его в 'functools.partial()' или лямбду, которая передает вам сам. – Kevin

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