Python에서 클래스 메서드와 함께 `property()` 데코레이터를 어떻게 사용할 수 있나요?

Patricia Arquette
풀어 주다: 2024-11-27 00:48:14
원래의
835명이 탐색했습니다.

How Can I Use the `property()` Decorator with Classmethods in Python?

클래스 메서드에서 property() 사용

Python은 계산되는 읽기 전용 또는 읽기-쓰기 속성을 생성하기 위해 property() 데코레이터를 제공합니다. 동적으로. 그러나 클래스 메서드와 결합하면 이 접근 방식은 몇 가지 제한 사항에 직면합니다.

Python 버전 3.8 이상에서는 property() 데코레이터를 클래스 메서드에 직접 적용할 수 있으므로 클래스 속성에 간결하게 액세스할 수 있습니다.

class Foo:
    _var = 5
    @classmethod
    @property
    def var(cls):
        return cls._var

    @classmethod
    @var.setter
    def var(cls, value):
        cls._var = value
로그인 후 복사

그러나 Python 2와 Python 3 3.8 이전 버전에서는 다른 접근 방식이 필요합니다. 속성은 인스턴스에 정의되므로 클래스 메서드와 함께 속성을 사용하려면 클래스의 메타클래스에 속성을 생성해야 합니다.

class Foo(object):
    _var = 5

    class __metaclass__(type):
        def __init__(cls, name, bases, dict):
            super().__init__(name, bases, dict)
            cls.var = property(cls.getvar, cls.setvar)

        @classmethod
        def getvar(cls):
            return cls._var

        @classmethod
        def setvar(cls, value):
            cls._var = value
로그인 후 복사

이 예에서 __metaclass__는 메타클래스의 속성을 정의한 다음 해당 인스턴스에 의해 상속됩니다. Foo 클래스.

또는 메타클래스 매개변수를 사용하여 사용자 정의를 정의할 수 있습니다. 메타클래스:

class FooMeta(type):
    def __init__(cls, name, bases, dict):
        super().__init__(name, bases, dict)
        cls._var = 5
        cls.var = property(cls.getvar, cls.setvar)

    @classmethod
    def getvar(cls):
        return cls._var

    @classmethod
    def setvar(cls, value):
        cls._var = value

class Foo(metaclass=FooMeta):
    pass
로그인 후 복사

이 설정에서 메타클래스는 _var 속성을 초기화하고 var 속성을 정의합니다. Foo의 인스턴스는 var 속성을 상속하고 이에 따라 _var 속성에 액세스할 수 있습니다.

위 내용은 Python에서 클래스 메서드와 함께 `property()` 데코레이터를 어떻게 사용할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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