전용 데코레이터 없이 Python에서 클래스 속성을 만드는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2024-11-07 15:22:03
원래의
410명이 탐색했습니다.

How to create class properties in Python without a dedicated decorator?

클래스 속성을 만드는 방법

클래스 속성은 인스턴스의 인스턴스가 아닌 클래스 자체를 통해 속성에 액세스하는 편리한 방법입니다. 수업. Python에서는 @classmethod 데코레이터를 사용하여 클래스에 메서드를 추가할 수 있지만 속성에 대한 데코레이터는 없습니다. 그러나 사용자 정의 설명자 클래스를 통해 유사한 효과를 얻을 수 있습니다.

사용자 정의 설명자 클래스

다음 코드는 사용자 정의 설명자 클래스인 ClassPropertyDescriptor를 정의합니다. 클래스 속성:

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")
        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
로그인 후 복사

클래스 속성 데코레이터

클래스 속성 생성을 단순화하기 위해 데코레이터 함수 classproperty가 정의됩니다.

def classproperty(func):
    if not isinstance(func, (classmethod, staticmethod)):
        func = classmethod(func)

    return ClassPropertyDescriptor(func)
로그인 후 복사

사용 예

다음 코드는 클래스 속성 데코레이터를 사용하여 Bar 클래스에서 bar라는 클래스 속성을 정의하는 방법을 보여줍니다.

class Bar(object):

    _bar = 1

    @classproperty
    def bar(cls):
        return cls._bar

    @bar.setter
    def bar(cls, value):
        cls._bar = value
로그인 후 복사

메타클래스

클래스를 통해 클래스 속성을 직접 설정할 수 있도록 메타클래스 정의인 ClassPropertyMetaClass가 사용됩니다.

class ClassPropertyMetaClass(type):
    def __setattr__(self, key, value):
        if key in self.__dict__:
            obj = self.__dict__.get(key)
        if obj and type(obj) is ClassPropertyDescriptor:
            return obj.__set__(self, value)

        return super(ClassPropertyMetaClass, self).__setattr__(key, value)
로그인 후 복사

Bar 클래스 정의에 __metaclass__를 추가하고 ClassPropertyDescriptor의 __set__ 메소드를 사용하면 클래스 자체를 통해 클래스 속성을 설정하는 기능이 활성화됩니다.

위 내용은 전용 데코레이터 없이 Python에서 클래스 속성을 만드는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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