返回介绍

示例:属性验证

发布于 2024-01-29 22:24:14 字数 1342 浏览 0 评论 0 收藏 0

为了结束本章的内容,让我们来看一个更实际的示例,以所有的4种属性管理方案来编写代码。我们将要使用的这个示例定义了一个CardHolder对象,它带有4个属性,其中3个属性是要管理的。管理的属性在获取或存储的时候要验证或转换值。对于同样的测试代码,所有4个版本都产生同样的结果,但是,它们以不同的方式实现了它们的属性。这个示例包含了很大一部分需要自学的内容。然而我们不会详细介绍其代码,因为它们都使用了我们在本章中已经介绍过的概念。

使用特性来验证

我们的第一段代码使用了特性来管理3个属性。与通常一样,我们可以使用简单的方法而不是管理属性,但是,如果我们在已有的代码中已经使用了属性,特性就能帮忙了。特性根据属性访问自动运行代码,但是关注属性的一个特定集合,它们不会用来广泛地拦截所有属性。

要理解这段代码,关键是要注意到,__init__构造函数方法内部的属性赋值也触发了特性的setter方法。例如,当这个方法分配给self.name时,它自动调用setName方法,该方法转换值并将其赋给一个叫做__name的实例属性,以便它不会与特性的名称冲突。

这一重命名(有时候叫做名称压缩)是必要的,因为特性使用公用的实例状态并且没有自己的实例状态。存储在一个属性中的数据叫做__name,而叫做name的属性总是特性,而非数据。

最后,这个类管理了叫做name、age和acct的属性;允许直接访问属性addr,并且提供了一个名为remain的只读属性,该属性完全是虚拟的并且根据需要计算。为了进行比较,这个基于特性的程序包含了39行代码:

self测试代码

如下的代码测试我们的类;将这段代码添加到文件的底部,或者把类放到一个模块中并先导入它。我们将对这个例子的所有4个版本使用这段同样的测试代码。当它运行的时候,我们创建了管理的属性类的两个实例,并且获取和修改其各种属性。期待失效的操作包装在try语句中:

如下是我们的self测试代码的输出。再一次说明,这对这个示例的所有版本都是一样的。分析这段代码,看看类的方法是如何调用的。账户显示出来,其中一些数字隐藏了,名称转换为一种标准格式,并且使用一个类属性访问拦截的时候,截止到退休的剩余时间就计算了出来:

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文