返回介绍

示例:私有 和 公有 属性

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

本章的最后两个小节介绍了使用装饰器的两个较大的例子。这两个例子都用尽量少的说明来展示,部分是由于本章的篇幅已经超出了限制,但主要是因为你应该已经很好地理解了装饰器的基础知识,足够能够自行研究这些例子。作为通用用途的工具,这些例子使我们有机会来看看装饰器的概念如何融入到更为有用的代码中。

实现私有属性

如下的类装饰器实现了一个用于类实例属性的Private声明,也就是说,属性存储在一个实例上,或者从其一个类继承而来。不接受从装饰的类的外部对这样的属性的获取和修改访问,但是,仍然允许类自身在其方法中自由地访问那些名称。它不是具体的C++或Java,但它提供了类似的访问控制作为Python中的选项。

在第29章,我们见到了实例属性针对修改成为私有的不完整的、粗糙的实现。这里的版本扩展了这一概念以验证属性获取,并且它使用委托而不是继承来实现该模型。实际上,在某种意义上,这只是我们前面遇到的属性跟踪器类装饰器的一个扩展。

尽管这个例子利用了类装饰器的新语法糖来编写私有属性,但它的属性拦截最终仍然是基于我们在前面各章介绍的__getattr__和__setattr__运算符重载方法。当检测到访问一个私有属性的时候,这个版本使用raise语句引发一个异常,还有一条出错消息;异常可能在一个try中捕获,或者允许终止脚本。

代码如下所示,在文件的底部还有一个self测试。它在Python 2.6和Python 3.0下都能够工作,因为它使用了Python 3.0的print和raise语法,尽管它在Python 2.6下只是捕获运算符重载方法属性(稍后更多讨论这一点):

当traceMe为True的时候,模块文件的self测试代码产生如下的输出。注意,装饰器是如何捕获和验证在包装的类之外运行的属性获取和赋值的,但是,却没有捕获类自身内部的属性访问:

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

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

发布评论

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