没有项目描述

autoprop的Python项目详细描述


https://img.shields.io/pypi/v/autoprop.svghttps://img.shields.io/pypi/pyversions/autoprop.svghttps://img.shields.io/travis/kalekundert/autoprop.svghttps://img.shields.io/coveralls/kalekundert/autoprop.svg

属性是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本身创建的属性。这就意味着如果 如果覆盖在超类中定义的一些访问器,将获得新的属性 引用被重写的访问器而不保留对 超类访问器。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java线程执行器服务   aspose如何通过java获得单词bookmark之前的所有文本内容?   一对一映射的java Hibernate合并问题   java SOAP XSD根元素问题   java如何保护我的Spring启动API   java使用GeoJson向google地图添加标记   java安卓:在SQLite中没有这样的列   java STS 2.8.0 StartExplorer/Legacy插件安装问题   java如何以编程方式获取AppBar高度?   在Java中将BigDecimal添加到BigDecimal   java不支持ntdll。dll是windows xp和windows vista的标准配置吗?   内容类型为application/xwwwformurlencoded的java Http Put请求在Spring中不起作用   java在数组中计算工资并返回答案   java数字/货币格式   elasticsearch java api中的弹性搜索查询