복붙노트

[PYTHON] 데코레이터 클래스와 데코레이터 함수의 차이점

PYTHON

데코레이터 클래스와 데코레이터 함수의 차이점

나는 그것들이 어떻게 불려지는지 짐작하지만, 나는 단지 예를 들어 줄 것이다.

장식 클래스 :

class decorator(object):
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        print 'something'
        self.func(*args, **kwargs)

데코레이터 기능 :

def decorator(func):
    def wrapper(*args, **kwargs):
        print 'something'
        return func(*args, **kwargs)
    return wrapper

하나 또는 다른 것을 사용하는 것은 단지 맛의 문제입니까? 실용적인 차이점이 있습니까?

해결법

  1. ==============================

    1.데코레이터를 구현하는 함수를 작성할 수 있으면 선호해야합니다. 그러나 일부 내부 상태를 저장하려는 경우와 같이 모든 데코레이터를 함수로 쉽게 작성할 수있는 것은 아닙니다.

    데코레이터를 구현하는 함수를 작성할 수 있으면 선호해야합니다. 그러나 일부 내부 상태를 저장하려는 경우와 같이 모든 데코레이터를 함수로 쉽게 작성할 수있는 것은 아닙니다.

    class counted(object):
        """ counts how often a function is called """
        def __init__(self, func):
            self.func = func
            self.counter = 0
    
        def __call__(self, *args, **kwargs):
            self.counter += 1
            return self.func(*args, **kwargs)
    
    
    @counted
    def something():
        pass
    
    something()
    print something.counter
    

    필자는 사람들을 (자신을 포함하여) 기능 만 갖춘 데코레이터를 쓰는 어리석은 노력을 겪어왔다. 왜 클래스의 오버 헤드가 대개는 거의 무시할 수 있는지는 아직 알 수 없습니다.

  2. ==============================

    2.그것은 일반적으로 단지 맛의 문제입니다. 대부분의 파이썬 프로그램은 오리 타이핑을 사용하며 호출 할 수있는 한 그들이 호출하는 것이 함수인지 또는 다른 유형의 인스턴스인지 여부를 실제로 신경 쓰지 않습니다. __call __ () 메서드가있는 함수는 모두 호출 가능합니다.

    그것은 일반적으로 단지 맛의 문제입니다. 대부분의 파이썬 프로그램은 오리 타이핑을 사용하며 호출 할 수있는 한 그들이 호출하는 것이 함수인지 또는 다른 유형의 인스턴스인지 여부를 실제로 신경 쓰지 않습니다. __call __ () 메서드가있는 함수는 모두 호출 가능합니다.

    함수 스타일 데코레이터를 사용하면 몇 가지 장점이 있습니다.

    이러한 이유로 대부분의 경우 함수 스타일 데코레이터를 사용합니다. 그러나 반례적으로 클래스 스타일 데코레이터가 내게 더 자연 스럽다는 최근 사례가 있습니다.

  3. from https://stackoverflow.com/questions/4650333/difference-between-decorator-classes-and-decorator-functions by cc-by-sa and MIT license