跳转到主要内容

类属性

项目描述

作者:

Philipp von Weitershausen

许可证:

Zope公共许可证,v2.1

动机

使用方法装饰器和描述符如property,我们可以轻松创建计算属性

>>> class JamesBrown(object):
...     @property
...     def feel(self):
...         return self._feel

尽管如此,这种属性不能被写入。您必须这样做

>>> class JamesBrown(object):
...     def _getFeel(self):
...         return self._feel
...     def _setFeel(self, feel):
...         self._feel = feel
...     feel = property(_getFeel, _setFeel)

这种方法的缺点是它将获取器和设置器留在类命名空间中。它也缺乏装饰器解决方案的紧凑拼写。为了应对这种情况,有些人喜欢写

>>> class JamesBrown(object):
...     @apply
...     def feel():
...         def get(self):
...             return self._feel
...         def set(self, feel):
...             self._feel = feel
...         return property(get, set)

除了apply将在Python 3000中消失的事实外,这种拼写感觉相当繁琐。

目标

应该有一种方法来声明一个读写属性,同时仍然使用紧凑且易于使用的装饰器拼写。读写属性应该像只读属性一样易于使用。我们明确不希望立即调用的函数,这个函数实际上只是帮助我们命名属性并为获取器和设置器创建局部作用域。

类属性

类属性允许您通过类声明来定义属性。您就像实现一个类一样定义动态属性。它的工作原理是这样的

>>> from classproperty import classproperty
>>> class JamesBrown(object):
...     class feel(classproperty):
...         def __get__(self):
...             return self._feel
...         def __set__(self, feel):
...             self._feel = feel
>>> i = JamesBrown()
>>> i.feel
Traceback (most recent call last):
...
AttributeError: 'JamesBrown' object has no attribute '_feel'
>>> i.feel = "good"
>>> i.feel
'good'

当然,也可以有删除器

>>> class JamesBrown(object):
...     class feel(classproperty):
...         def __get__(self):
...             return self._feel
...         def __set__(self, feel):
...             self._feel = feel
...         def __delete__(self):
...             del self._feel
>>> i = JamesBrown()
>>> i.feel = "good"
>>> del i.feel
>>> i.feel
Traceback (most recent call last):
...
AttributeError: 'JamesBrown' object has no attribute '_feel'

支持者