2014-07-26 3 views
0

다른 클래스 메서드로 클래스 메서드를 꾸미고있었습니다. 이클래스 메서드로 클래스 메서드 꾸미기

from functools import wraps 

class MyClass(object): 
    def __init__(self): 
     print('Within my class object') 

    def my_decorator(func_to_decorate): 
     @wraps(func_to_decorate) 
     def wrapper(self): 
      print('Before the call') 

      func_to_decorate(self) 

      print('After the function call') 
     return wrapper 

    @my_decorator 
    def print_name(self): 
     print('My name is ------ ') 

mobj = MyClass() 
mobj.print_name() 

가 나는 방법은 무엇을하지 않았다는 것을 깨달았다 장식 my_decorator의 함수 정의를 보면서 내가 다음

Before the call 
My name is ------ 
After the function call 

그러나 필요한 출력을 얻을 좋은 작품처럼 클래스 본다 클래스 메서드는 일반적으로 첫 번째 인수로 걸린다. self

내 질문은 지금 무엇입니까? my_decorator의 형식은 무엇입니까? 그것은 클래스 메소드, 일반적인 메소드 또는 특별한 메소드입니까?

일반적으로 클래스 내의 메서드는 암시 적 인수 self을 사용하거나 클래스 메서드가 암시 적 인수 cls을 사용합니다. 데코레이터는 어느 쪽도 사용하지 않습니다.

여기에서 무슨 일이 일어 났는지 설명해주세요.

+0

부수적으로 클래스 메소드와 인스턴스 메소드를 혼동하고 있습니다. 정규 메소드는 인스턴스 메소드라고 부릅니다. 인스턴스를 첫 번째 인수 인'self'로 사용하기 때문입니다. 클래스 메소드는 데코레이터'@ classmethod'를 사용하여 만들어지며 클래스를 첫 번째 인자로 사용합니다. 일반적으로'cls'라고합니다. –

+0

@SvenMarnach 제 잘못입니다. 나를 고쳐 주셔서 고마워요. – rgk

답변

1

클래스 또는 인스턴스에서 액세스하지 않으므로 간단한 기능이므로 클래스 정의 내에서 장식 자로 사용할 경우 self 또는 cls이 필요하지 않습니다. 암시 적 인수는 클래스 나 인스턴스를 통해 액세스 할 때만 이러한 함수에 의해 강제됩니다. 클래스 나 인스턴스를 통해 액세스하면 원래 함수를 감싸는 겹치지 않은 바인드 된 메서드를 반환하기 때문입니다.

당신이 클래스의 외부 장식을 이동할 경우에 당신은 당신이 첫 번째 인수로 인스턴스를 보낼 것으로 예상 것을 볼 수 있습니다 :

MyClass.print_name = MyClass.my_decorator(MyClass.print_name) 
mobj = MyClass() 
mobj.print_name() 

오류 :

MyClass.print_name = MyClass.my_decorator(MyClass.print_name) 
TypeError: unbound method my_decorator() must be called with MyClass instance as first argument (got instancemethod instance instead) 

당신이 비록 또는 cls이 아니거나 boun의 im_func 속성을 사용하여 기본 함수에 액세스하는 staticmethod로 my_decorator을 선언하면이 오류를 방지 할 수 있습니다. D, 언 바운드 개체 :

MyClass.print_name = MyClass.my_decorator.im_func(MyClass.print_name) 

당신은 data model 페이지의 호출 가능 유형 부분을 읽어야합니다.

관련 문제