用于生成具有可编程性的命名元组的python元类

programmabletuple的Python项目详细描述


基本用法

字段

可编程元组直接在 标准库。所以不像普通的用户定义类 ,实例只能有一组预定义的字段 每堂课。由于初始化后无法更改实例,因此 需要将有关实例的信息提供给初始值设定项。所以 初始值设定项的参数唯一定义可编程元组的值。 因此它们被称为类的定义字段。除了定义 字段,可以将其他字段添加到类实例中以保存 其他重要数据。这些字段将被称为数据字段。 这可以通过将名称列表分配给 \u data\u字段来实现。 类的属性,与 \u slots\uuu 属性相同 使用。数据字段的实际值可以在初始化器中设置 和平常一样。例如,为 人们存储他们的名字和姓氏,我们希望实例 把全名用逗号分隔以便按字母顺序排列,我们可以 定义

classPerson(ProgrammableTuple):__data_fields__=['full_name']def__init__(self,first_name,last_name):self.full_name=', '.join([last_name,first_name])

这样,如果我们通过运行person('john', 'smith') ,定义字段和数据字段的所有字段的值,可以 所有这些都可以使用点符号检索,比如 p.full_name 。 注意,如果某些字段希望保持私有,则使用相同的下划线 可以使用python的约定。只是不建议继续定义 私有属性。

对于字段,有两个关键字参数可用于类 创造。默认情况下为true的 auto_defining参数控制 将定义字段自动分配给 在实际调用用户定义的初始值设定项之前的初始值设定项。为了 初始值设定项中未显式给定值的字段, 默认参数可以设置为返回默认值 以字符串形式给出字段名称时要设置的值。

请注意,虽然没有强制要求将值设置为 定义字段应与给定给初始值设定项的参数匹配, 建议至少可以使用定义字段来复制 对象。例如,对于一个名为 a 且具有 a b 字段的类,它 在任何情况下保持 a(spam.a,spam.b)==spam 都是一个很好的做法 类的spam ,而 spam.a 不需要匹配 参数 a 用于创建 垃圾邮件。经常争论 将接受参数的各种类型,但特定的形式是 将作为属性存储。这种形式可以称为规范形式。 为了那个论点。例如,初始值设定项可以允许 定义字段,但最好将其转换为要存储在 不可变对象。元素的元组形式是 那个论点。它不需要匹配用于 创造,但它总是能够再现价值。对于大多数情况下 定义字段只是作为参数 自动定义 选项可以设置为 以保存代码行。但是 对于几乎所有参数都需要转换和指定的情况, 可以关闭该选项,以节省自动分配的开销。

方法

也可以为具有完全相同的可编程元组定义方法 语法作为普通的用户定义类。就在这里 self 可以在 \uuu init\uuu 方法中进行变异,任何试图进行变异的尝试 self 会在任何其他方法中导致错误。所以这里的方法应该 更专注于返回值而不是改变 对象的状态。因为这个明显的偏离了经典 Smalltalk风格的面向对象编程,方法通常可以是 在类之外明确定义为一个普通函数,然后我们可以 为了方便,把它们送到班上。例如,如果我们有 符号数学表达式类和计算 关于符号的导数,我们可以做

defdiff_expr(expr,symb):"""Compute the derivative w.r.t. a symbol"""......classExpr(ProgrammableTuple):......diff=diff_expr......

这样,就可以将表达式 e 与符号区分开来 x ,我们可以同时做 e.diff(x) diff-expr(e,x) 。它只需要 注意,对于打算用作方法的函数, 要用作 self 的参数需要放在第一个槽中。的 课程方法只有在需要时才能保持正常。

无损更新

我们经常需要不同于 相对少量的现有价值。对于可变类,通常是 是通过改变实例来实现的。但是,这里的实例不是 变长。因此提供了非破坏性地更新实例的方法。 注意,这些方法将返回新实例,并更新字段 保持原始值不变,就像haskell记录一样。

为此,基本上提供了两种方法, \u update 更换。它们都采用关键字参数,关键字是名称 要更新的字段的值,并且值是新值。但是为了 方法,只有定义字段才能被更新,等等 重要的是,将使用更新的定义创建一个新实例 通过初始值设定项的字段。同时,替换方法 只需简单地替换一个特定的字段 再次通过初始化器,它对定义字段和数据字段都有效。

这两个方法都是用一个初始下划线命名的,这不是 只是试图与标准库中的命名元组保持一致, 但也鼓励只在方法上使用它们。然后包装 方法可以携带更新操作的实际语义。

继承

可编程元组类可以从其他可编程元组类继承。 而且这种继承已经被做成与普通易变的 尽可能的上课。子类的实例是 并且可以访问超类的所有方法。只是 一个显著的区别是,在初始化器中,内置的 super 函数是 不像以前那样工作。要调用超类的初始值设定项,我们可以 使用 self.super()。\u init\u 代替,或者我们可以命名超类 显式地,比如 超类。

其他

具有所有可散列定义字段的可编程元组的实例有 可拆卸的。默认哈希函数是元组的默认哈希 由类标识和定义字段组成。

实例都是可选择的。

作为命名元组,这个元类的类将携带一个 将实例转换为字典。该方法带有两个关键字 参数, full 可用于使字典包含数据字段 而且, ordered 可用于返回有序字典。 两者都默认为false。

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

推荐PyPI第三方库


热门话题
禁用Eclipse Java调试器的热代码替换   每次运行jUnit测试时,JavaIntelliJIDEA都会重建整个模块   java如何从InputStream对象读取特定数据?   java我想在每次从recyclerview中单击一个项目时将对象添加到领域数据库   安卓在C和系统中退出(0)的实践。在Java中退出(0)   azure如何将文本文件附加到java中现有的zip文件?   java Spring安全性工作在tomcat服务器(Eclipse)上,但当我将war文件放入tomcat webapp时,Spring安全性就不工作了   java为什么在提供lambda参数时必须捕获异常?   java公共类扩展了JPanel   java如何在SpringAspectJ中使用“declare”指令?   java是编写大量文件的最佳方式   java创建具有多个类依赖项的jar文件   面向对象方法在Java中模拟类分类   java未找到类型为com的返回值的转换器。春天mvc。模型用户]   vb。net在java中解压缩visual basic中压缩的字符串   java为什么我可以更改类中的private属性?   更新Android Studio后java Gradle不工作   图像Java帮助。不规则间隔的幻灯片放映