返回介绍

实现细节之一

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

这段代码有点复杂,并且你最好自己跟踪运行它,看看它是如何工作的。然而,为了帮助你理解,这里给出一些值得注意的提示。

继承与委托的关系

第29章中给出的粗糙的私有示例使用继承来混入__setattr__捕获访问。然而,继承使得这很困难,因为从类的内部或外部的访问之间的区分不是很直接的(内部访问应该允许常规运行,并且外部的访问应该限制)。要解决这个问题,第29章的示例需要继承类,以使用__dict__赋值来设置属性,这最多是一个不完整的解决方案。

这里的版本使用的委托(在另一个对象中嵌入一个对象),而不是继承。这种模式更好地适合于我们的任务,因为它使得区分主体对象的内部访问和外部访问容易了很多。对主体对象的来自外部的属性访问,由包装器层的重载方法拦截,并且如果合法的话,委托给类。类自身内部的访问(例如,通过其方法代码内的self)没有拦截并且允许不经检查而常规运行,因为这里没有继承私有的属性。

装饰器参数

这里使用的类装饰器接受任意多个参数,以命名私有属性。然而,真正发生的情况是,参数传递给了Private函数,并且Private返回了应用于主体类的装饰器函数。也就是说,在装饰器发生之前使用这些参数;Private返回装饰器,装饰器反过来把私有的列表作为一个封闭作用域应用来“记住”。

状态保持和封闭作用域

说到封闭的作用域,在这段代码中,实际上用到了3个层级的状态保持:

·Private的参数在装饰发生前使用,并且作为一个封闭作用域引用保持,以用于onDecorator和onInstance中。

·onDecorator的类参数在装饰时使用,并且作为一个封闭作用域引用保持,以便在实例构建时使用。

·包装的实例对象保存为onInstance中的一个实例属性,以便随后从类外部访问属性的时候使用。

由于Python的作用域和命名空间规则,这些都很自然地工作。

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

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

发布评论

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