2016-07-06 1 views
0

데코레이터에 대해 질문이 있습니다. 나는 파이썬에서 데코레이터 개념을 이해하려고 노력하고 있지만 클래스에 데코레이터를 사용하는 것에 매달려있다. 파이썬에서 객체 지향 프로그램에 데코레이터를 구현하는 방법

class decorate: 
     def __init__(self,f): 
      self.f = f 

     def __call__(self) 
      self.f() 
@decorate 
def foo(): 
    print "inside foo" 
foo() 

with_class.py 나는 한 평 파일 내부의 전체 코드를 삽입하고 예상대로 실행. OUTPUT : inside foo

하지만 다른 클래스의 객체를 다른 .py 파일로 꾸밀려고하고 동일한 출력을 얻으려고 시도했습니다. 첫 번째 .py 파일에 foo()을 주석 처리하고 두 번째 .py 파일에서 아래 코드를 사용했습니다.

use_class.py

import with_class 
a = with_class.decorate() 

그러나 오류 TypeError: __init__ takes exactly 2 arguments(1 given)을 던지고있다. __init__을 호출하는 동안 우리는 2 개의 인수를 제공해야합니다. use_class.pyfoo 메서드를 실행하기 위해 전달할 항목을 얻지 못하고 있습니다. 다시 에서 f을 제거하여 __call__(self,f)을 사용해 보았지만 오류가 발생합니다. 그것은 개념을 얻지 못하고있는 것 같습니다.

@decorate 
def foo(): 
    print "inside foo" 

이 무엇

+0

을해야합니까? 그 인수를 전달하십시오. – user2357112

+0

왜 당신은'꾸미다 '라고 부르니? 'with_class.foo()'를 호출해야합니다. – Bakuriu

+0

데코 레이트가 클래스입니다. –

답변

2

그래서 foo가 장식 기능 (클래스 decorate의 객체, 정말)가 with_class 모듈에 바인딩되는 이름입니다

def foo(): 
    print "inside foo" 

foo = decorate(foo) 

에 해당합니다. 당신이 decorate` 함수로, 어떤 인수가 당신이 그것을 통과 한 것`쓴 경우 use_class.py에서, 당신은 다음

import with_class 

a = with_class.foo() 
+0

위의 데코 레이팅 된 함수에 매개 변수를 전달하려면 :: a = with_class.foo (x)와 같이 수행하여 with_class.py 클래스를 수정하십시오. def __init __ (self, f) : self.f = F 데프 __call __ (자기, 배) self.f (x)는 @decorate 데프 foo는 (X) : 인쇄 "foo는 내부에"내가 X 대신에 함수를 전달하려면 지금 –

+0

을 X. functin with_class.py 및 use_class.py에 "a = with_class.foo (with_class.decorate.disp())"로 전달하려고합니다. disp()는 클래스 내부에서 정의 된 함수입니다. with_class.py의 코드가 다음과 같이 수정되었습니다. class decorate : def __init __ (self, f) : self.f = f def __call __ (self, g) self.f (g) def disp (self) : 디스플레이 "내에서"인쇄하십시오. @ 장식물 def foo (fn) : "inside foo"fn() –

관련 문제