没有项目描述

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 Spinner选定值未上载到firebase数据库   java如何通过bukkit中的配置添加消息?   java在SharedReference中保存列表的泛型类型   javascript Java小程序未定义   swt在Java中构建控制台应用程序   java OAuth同意屏幕没有突然显示,没有错误?   java webview选择文件安卓不工作   java Spring boot JPA如何从同一连接添加多个数据库?   java JDBC DB2驱动程序计时器线程处于阻塞状态   java我在vscode中运行flatter时看到一个错误在phone中运行应用程序somone能否帮助我plz   Java:生成JSON:如何避免生成不完整的JSON   java Date compareTo()方法始终返回1   当使用Junit runner运行测试时,java Spring自动连线失败   java Android/Sockets如何将信息从主UI线程发送到socket线程?   java Android内存声明全局变量   java如何在JBoss中拥有多个具有相同JNDI名称的数据源?   python在Java中嵌入CPython时,为什么会挂起?   java如何提供深度模拟对象?   java“find:smallint,expected:integer”Hibernate对informix数据库的验证在短时间内失败