문제

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__)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top