2014-12-02 2 views
4

Вот что я пытаюсь сделатьКак использовать лямбда как метод внутри класса?

class BaseClass(object): 
    successify = lambda x: "<Success>%s</Success>" % x 
    errorify = lambda x: "<Error>%s</Error>" % x 
    def try1(self): 
     print successify("try1") 
    def try2(self): 
     print self.successify("try2") 

Но ни один из этих методов, кажется, работают ..

>>> BaseClass().try1() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 5, in try1 
NameError: global name 'successify' is not defined 
>>> BaseClass().try2() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 7, in try2 
TypeError: <lambda>() takes exactly 1 argument (2 given) 

Как использовать лямбды в качестве методов в классе?

+0

Просим, ​​пожалуйста, * не использовать *; используя «def successify (self, x): return» % s «% x» имеет больше метаданных, читает более красиво и принимает * всего 3 символа *. – Veedrac

+0

@ Veedrac Это то, что я использовал в конце концов, и точно по тем же причинам. Это было скорее наткнулось на ситуацию, когда я не мог понять, почему лямбды не работают. FWIW, я почти ожидал, что это не будет поддержано и захочет найти соответствующие причины, если они есть. –

ответ

0

Если вы хотите получить доступ к successify в качестве функции объекта, то первый аргумент self означает экземпляр объекта.

вы должны изменить свою функцию ламбада, если вы должны использовать self.successify

successify = lambda self, x: "<Success>%s</Success>" % x 
8

У вас есть несколько возможностей использования/доступа класса переменных лямбды. Три из них:

class BaseClass(object): 
    successify = lambda x: "<Success>%s</Success>" % x 
    errorify = lambda x: "<Error>%s</Error>" % x 
    def try1(self): 
     print(self.__class__.successify("try1")) 
    def try2(self): 
     print(self.__class__.successify("try2")) 

# or 

class BaseClass(object): 
    successify = lambda x: "<Success>%s</Success>" % x 
    errorify = lambda x: "<Error>%s</Error>" % x 
    def try1(self): 
     print(BaseClass.successify("try1")) 
    def try2(self): 
     print(BaseClass.successify("try2")) 

# or Please not changes to lambda definitions below 

class BaseClass(object): 
    successify = lambda self,x: "<Success>%s</Success>" % x 
    errorify = lambda self,x: "<Error>%s</Error>" % x 
    def try1(self): 
     print(self.successify("try1")) 
    def try2(self): 
     print(self.successify("try2"))  
+0

Первые два подхода для python3, а последний работает в python2. –

+0

@ VishnuUpadhyay Thx. Должен был проверить это на python 2. Обычно я работаю с python 3 и забываю, что некоторые вещи не работают на python 2. – Marcin

+0

Но это отличный ответ. Благодарю. –

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