[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.데코레이터를 구현하는 함수를 작성할 수 있으면 선호해야합니다. 그러나 일부 내부 상태를 저장하려는 경우와 같이 모든 데코레이터를 함수로 쉽게 작성할 수있는 것은 아닙니다.
데코레이터를 구현하는 함수를 작성할 수 있으면 선호해야합니다. 그러나 일부 내부 상태를 저장하려는 경우와 같이 모든 데코레이터를 함수로 쉽게 작성할 수있는 것은 아닙니다.
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.그것은 일반적으로 단지 맛의 문제입니다. 대부분의 파이썬 프로그램은 오리 타이핑을 사용하며 호출 할 수있는 한 그들이 호출하는 것이 함수인지 또는 다른 유형의 인스턴스인지 여부를 실제로 신경 쓰지 않습니다. __call __ () 메서드가있는 함수는 모두 호출 가능합니다.
그것은 일반적으로 단지 맛의 문제입니다. 대부분의 파이썬 프로그램은 오리 타이핑을 사용하며 호출 할 수있는 한 그들이 호출하는 것이 함수인지 또는 다른 유형의 인스턴스인지 여부를 실제로 신경 쓰지 않습니다. __call __ () 메서드가있는 함수는 모두 호출 가능합니다.
함수 스타일 데코레이터를 사용하면 몇 가지 장점이 있습니다.
이러한 이유로 대부분의 경우 함수 스타일 데코레이터를 사용합니다. 그러나 반례적으로 클래스 스타일 데코레이터가 내게 더 자연 스럽다는 최근 사례가 있습니다.
from https://stackoverflow.com/questions/4650333/difference-between-decorator-classes-and-decorator-functions by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 패키징을 위해 console_script 진입 점 인터프리터 변경 (0) | 2018.11.17 |
---|---|
[PYTHON] pycharm에서 Conda 환경 사용 (0) | 2018.11.17 |
[PYTHON] 파이썬에서 NTFS 연결 지점 만들기 (0) | 2018.11.17 |
[PYTHON] 함수 이름에서 변수 이름 앞에 *와 **는 무엇을 의미합니까? [복제] (0) | 2018.11.17 |
[PYTHON] 파이썬에서 유니 코드 이스케이프 시퀀스가있는 유니 코드 텍스트 [duplicate] (0) | 2018.11.17 |