没有项目描述
autoprop的Python项目详细描述
属性是python中允许访问器函数(即getter)的特性 和setters)伪装成常规属性。这使得 为需要缓存结果、延迟加载的类提供透明的api 数据、维护不变量或以任何其他方式对属性访问作出反应。
不幸的是,制作一个属性需要大量烦人的样板文件 代码。有几种方法可以做到这一点,但最常见和最简洁的是 要求您装饰两个函数(使用两个不同的装饰器)和 键入属性的名称三次:
class RegularProperty: @property def attr(self): return self._attr @attr.setter def attr(self, new_value): self._attr = new_value
autoprop模块通过在类中搜索 访问器方法并添加与任何此类方法对应的属性 发现。例如,下面的代码定义了与代码相同的属性 上图:
@autoprop class AutoProperty: def get_attr(self): return self._attr def set_attr(self, new_value): self._attr = new_value
安装
autoprop在pypi上可用,因此您可以使用pip:
pip install autoprop
用法
要使用autoprop,请导入autoprop模块并将其直接用作 类装饰符:
import autoprop @autoprop class Vector2D: def __init__(self, x, y): self._x = x self._y = y def get_x(self): return self._x def set_x(self, x): self._x = x def get_y(self): return self._y def set_y(self, y): self._y = y
decorator在类中搜索以get_开头的方法, set_,或del_,并使用它们创建属性。的名字 属性取自下划线后面的任何内容。例如, 方法get_x将用于生成名为x的属性。任何 每个方法允许getter、setter和deleter方法的组合 财产。
除了有正确的前缀外,还有两个条件方法必须满足 才能变成财产。首先是他们必须 所需参数的正确数目。getter和deleters不能有任何 必需的参数(除了self)。setter必须正好有一个必需的 参数(而不是self),这是要设置的值。默认值、变量和 关键字参数都可以;只有必需参数的数量才重要。
任何名称正确但参数错误的方法都是无声的 忽略。对于需要索引的getter来说,这很好。 即使这样的getter不能生成属性,autoprop允许它 要遵循与任何getter相同的命名约定,可以是:
@autoprop class Vector2D: ... def get_coord(self, i): if i == 0: return self._x if i == 1: return self._y def set_coord(self, i, new_coord): if i == 0: self.x = new_coord if i == 1: self.y = new_coord
这样,类的用户总是可以期望找到名为 get_*和set_*,以及与这些访问器对应的属性 不需要任何额外信息的基本属性。
第二个条件是属性必须有一个尚未命名的名称 正在使用中。这保证了显式添加到类中的任何内容都不会 覆盖,它使您能够自定义某些属性 如果你愿意的话。请注意,此标准不适用于 autoprop本身创建的属性。这就意味着如果 如果覆盖在超类中定义的一些访问器,将获得新的属性 引用被重写的访问器而不保留对 超类访问器。