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
程式碼定義了一個類別Example,其中包含實例屬性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
classproperty 裝飾器建立一個描述符處理類別屬性的取得和設定操作。
透過新增元類別定義,我們也可以直接在類別上設定類別屬性:
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中文網其他相關文章!