返回介绍

使用描述符验证

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

现在,让我们使用描述符而不是使用特性来重新编写示例。正如我们已经看到的,描述符在功能和角色上与特性类似。实际上,特性基本上是描述符的一种受限制的形式。和特性一样,描述符设计来处理特定的属性访问,而不是通用的属性访问。和特性不同,描述符有自己的状态,并且它们是一种更为通用的方案。

要理解这段代码,注意__init__构造函数方法内部的属性赋值触发了描述符的__set__操作符方法,这一点还是很重要。例如,当构造函数方法分配给self.name时,它自动调用Name.__set__()方法,该方法转换值,并且将其赋给了叫做name的一个描述符属性。

和前面基于特性的变体不同,在这个例子中,实际的name值附加到了描述符对象,而不是客户类实例。尽管我们可以把这个值存储在实例状态或描述符状态中,后者避免了需要用下划线压缩名称以避免冲突。在CardHolder客户类中,名为name的属性总是一个描述符对象,而不是数据。

最后,这个类实现了和前面的版本同样的属性:它管理名为name、age和acct的属性。允许直接访问属性addr,并且提供一个名为remain的只读属性,remain是完全虚拟的并且根据需要计算。注意我们为何在其描述符中捕获对remain的赋值,并引发一个异常。正如我们前面所介绍的,如果没有这么做,对一个实例这一属性的赋值,将会默默地创建一个实例属性而隐藏了类属性描述符。为了进行比较,这个基于描述符的代码占了45行:

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

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

发布评论

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