2012-08-17 1 views
2

파이썬에서 object-method를 일반적인 함수로 내보내고 싶습니다. 개체가 닫힙니다. 다음에 처럼이 잘 작동하고 예상대로 15 인쇄파이썬 : 함수를 객체로 닫는 방법으로 내보내기

from functools import partial 

class A(object): 
    def __init__(self,a): 
     self.a = a 

    def m(self,b): 
     return self.a+b 

    def exportm(self): 
     return lambda b,self=self: self.m(b) 
     #return partial(self.m,self=self) 

f = A(10).exportm() 

print f(5) 

. 내가 주석 라인으로 복귀 람다 라인을 대체한다면 다음과 같은 오류를주고 실패합니다

TypeError: m() got multiple values for keyword argument 'self' 

나는 functools를 사용하여 람다 식에 의지보다 더 깨끗 것을 이해합니다. 그래서 functools에서 부분 또는 다른 도구를 사용하여이를 수행하는 방법을 알고 싶습니다.

답변

6

self.m은 이미 바인딩되어 있으므로 self=self을 전달할 필요가 없습니다. 단순히 self.m을 반환하십시오. 이상의 인수를 들어, partial(self.m, ...)를 사용

class A(object): 
    def __init__(self, a): 
     self.a = a 

    def m(self, b, c): 
     return self.a + b + c 

    def exportm(self): 
     return partial(self.m, 300) 

f = A(10).exportm() 
print f(5) 
+0

고마워요, 그 작품은 매우 깨끗하게 보입니다. –

0

KISS principle을 따르십시오. 코드를 좀 더 전문적으로 보이게 만드는 것을 사용할 필요가 없습니다. 마찬가지로 thg435 이미 return self.m 할 것이라고 말했다.

코드가 희박할수록 코드를 읽고, 한 달을 말하고, 다른 개발자가 읽을 때 더 쉽게 코드를 이해할 수 있습니다.

+0

동의합니다 :이 예에서는 총 잔인 함과 비슷하지만 내 포인트를 표시하기 위해 잘라 냈기 때문입니다. –