Python 데코레이터가 내 코드에 어떤 작업을 하는지 볼 수 있나요?
-
20-12-2019 - |
문제
Python 데코레이터를 적용한 함수로 어떤 작업을 수행했는지 확인할 수 있는 방법이 있습니까?예를 들어 내가 가지고 있는 경우
class A(object):
@property
def something(self):
return 0
어떤 목적으로 실행된 코드인지 알고 싶습니다. something
실제로는 같습니다.이를 수행할 수 있는 방법이 있습니까?
해결책
데코레이터는 코드를 생성하지 않습니다.데코레이터는 실제로 단지 구문상의 설탕일 뿐입니다:
@property
def something(self):
return 42
실제로는 다음과 같이 해석됩니다.
def something(self):
return 42
something = property(something)
예를 들어뒤에 오는 표현 @
부호가 평가되고 결과가 호출되어 다음 함수나 클래스를 전달합니다. @
선.그러면 데코레이터가 무엇이든 반환합니다. 대체하다 원래 개체.
자기 성찰의 목적으로, @
라인은 ~ 아니다 유지;존재하는 데코레이터를 찾으려면 소스 코드 자체를 구문 분석해야 합니다.데코레이터는 새 객체를 반환할 의무가 없습니다.원본 객체를 변경하지 않고 반환할 수 있지만 자체 조사로는 차이점을 알 수 없습니다.
가장 좋은 방법은 데코레이터의 소스로 돌아가서 코드를 읽는 것입니다.그만큼 property
데코레이터는 C로 구현되었지만 설명자 하우투 동일한 작업을 수행하는 Python 구현이 포함되어 있습니다.
class Property(object):
"Emulate PyProperty_Type() in Objects/descrobject.c"
def __init__(self, fget=None, fset=None, fdel=None, doc=None):
self.fget = fget
self.fset = fset
self.fdel = fdel
if doc is None and fget is not None:
doc = fget.__doc__
self.__doc__ = doc
def __get__(self, obj, objtype=None):
if obj is None:
return self
if self.fget is None:
raise AttributeError("unreadable attribute")
return self.fget(obj)
def __set__(self, obj, value):
if self.fset is None:
raise AttributeError("can't set attribute")
self.fset(obj, value)
def __delete__(self, obj):
if self.fdel is None:
raise AttributeError("can't delete attribute")
self.fdel(obj)
def getter(self, fget):
return type(self)(fget, self.fset, self.fdel, self.__doc__)
def setter(self, fset):
return type(self)(self.fget, fset, self.fdel, self.__doc__)
def deleter(self, fdel):
return type(self)(self.fget, self.fset, fdel, self.__doc__)
제휴하지 않습니다 StackOverflow