클래스 속성을 정의하기 위해 Python에 `@property`에 해당하는 데코레이터가 있나요?

Mary-Kate Olsen
풀어 주다: 2024-11-11 00:52:03
원래의
575명이 탐색했습니다.

Is there a decorator equivalent to `@property` in Python for defining a class property?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿