Python에서 클래스 속성을 정의하는 방법
Python에서는 @classmethod 데코레이터를 사용하여 클래스에 메서드를 추가할 수 있습니다. 그러나 클래스의 속성을 정의하는 데 동등한 데코레이터가 있습니까?
클래스 속성 데코레이터
이 질문에 대답하려면 다음 예를 고려해 보겠습니다.
class Example(object): the_I = 10 def __init__(self): self.an_i = 20 @property def i(self): return self.an_i def inc_i(self): self.an_i += 1 # is this even possible? @classproperty def I(cls): return cls.the_I @classmethod def inc_I(cls): cls.the_I += 1 e = Example() assert e.i == 20 e.inc_i() assert e.i == 21 assert Example.I == 10 Example.inc_I() assert Example.I == 11
이 예에서는 @classproperty 데코레이터를 사용하여 클래스 속성을 정의하려는 의도가 있습니다. 그러나 "NameError: name 'classproperty'가 정의되지 않았습니다"라는 오류가 발생합니다.
해결책
클래스 속성을 생성하려면 ClassPropertyDescriptor라는 사용자 정의 설명자 클래스를 사용할 수 있습니다. 사용됩니다:
import inspect class ClassPropertyDescriptor(object): def __init__(self, fget, fset=None): self.fget = fget self.fset = fset def __get__(self, obj, klass=None): if klass is None: klass = type(obj) return self.fget.__get__(obj, klass)() def __set__(self, obj, value): if not self.fset: raise AttributeError("can't set attribute") if inspect.isclass(obj): type_ = obj obj = None else: type_ = type(obj) return self.fset.__get__(obj, type_)(value) def setter(self, func): if not isinstance(func, (classmethod, staticmethod)): func = classmethod(func) self.fset = func return self
ClassPropertyDescriptor 클래스는 클래스 속성. 속성 값 가져오기 및 설정을 처리하는 __get__ 및 __set__ 메서드를 구현합니다.
클래스 속성 데코레이터
클래스 속성 설명자를 더 쉽게 사용하려면 @라는 데코레이터를 사용하세요. 클래스 속성을 생성할 수 있습니다:
def classproperty(func): if not isinstance(func, (classmethod, staticmethod)): func = classmethod(func) return ClassPropertyDescriptor(func)
예 사용법
사용자 정의 클래스 속성 설명자와 데코레이터를 사용하면 예제를 다음과 같이 다시 작성할 수 있습니다.
class Bar(object): _bar = 1 @classproperty def bar(cls): return cls._bar @bar.setter def bar(cls, value): cls._bar = value
이 코드는 액세스하고 수정할 수 있는 클래스 속성 표시줄을 정의합니다. 예상대로. 클래스 인스턴스 또는 클래스 자체의 속성 값을 수정하면 클래스의 모든 인스턴스에 대한 값이 업데이트됩니다.
위 내용은 클래스 속성을 정의하기 위해 Python에 `@property`에 해당하는 데코레이터가 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!