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
코드는 인스턴스 속성 i, 클래스 속성 I, 두 클래스 메서드 inc_i 및 inc_I를 사용하여 클래스 예제를 정의합니다. .
그러나 @classproperty에 사용된 구문은 Python에서 올바르지 않습니다. 클래스 속성을 생성하려면 다음 접근 방식을 사용할 수 있습니다.
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 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
클래스 속성 데코레이터는 설명자를 생성합니다. 클래스 속성에 대한 가져오기 및 설정 작업을 처리합니다.
메타클래스 정의를 추가하면 클래스 속성 설정을 직접 처리할 수도 있습니다. 클래스:
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__ = ClassPropertyMetaClass
이제 인스턴스 및 클래스 속성을 모두 예상대로 사용하고 설정할 수 있습니다.
위 내용은 Python에서 데코레이터를 사용하여 클래스 속성을 정의할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!