系统学习Python——装饰器:“私有“和“公有“属性案例-[公有声明的推广]

2024-03-13 01:36

本文主要是介绍系统学习Python——装饰器:“私有“和“公有“属性案例-[公有声明的推广],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

分类目录:《系统学习Python》总目录


既然有了一个Private实现,推广其代码以容纳Public声明就很简单了一一它们基本上是Private声明的反过程,因此我们只需要取消内部测试。本文列出的示例允许一个类使用装饰器来定义一组PrivatePublic的实例属性一一一存储在一个实例上的任何种类的属性,或者从其各个类继承的属性,使用如下的语义:

  • Private声明类实例的那些不能获取或赋值的属性,而从类的方法代码内部获取或赋值除外。也就是说,任何声明为Private的名称都不能从类的外访问,而任何没有声明为Private的名称都可以自由地从类的外部获取或赋值。
  • Public声明了一个类的实例属性,它可以从类的外部以及在类的方法内部获取和访问。也就是说,声明为Public的任何名称,都可以从任何地方自由地访问,而没有声明为Public的任何名称,不能从类的外部访问。

PrivatePublic声明是有意被设计为相互排斥的:当使用了Private,所有未声明的名称都被认为是Public的;而当使用了Public,所有未声明的名称都被认为是Private。它们本质上相反,尽管不是由类方法创建的未声明名称行为略有不同一一新的名称可以赋值并且由此从类的外部在Private之下创建(所有未声明的名称都是可以访问的),但不能在Public下创建的(所有未声明的名称都是不可访问的)。

再一次,我们可以自己研究这些代码并体验它们是如何工作的。需要注意的是,这个方案在顶层添加了额外的第四层状态保持逻辑,超越了前面描述的三个层面:lambda所使用的测试函数保存在一个额外的外层作用域中。这个示例可以在Python3.X或Python2.6或之后的版本下运行,尽管它在Python3.X下运行的时候带有一个警告:

traceMe = False
def trace(*args):if traceMe:print('[' + ' '.join(map(str, args)) + ']')def accessControl(failIf):def onDecorator(aClass):class onInstance:def __init__(self, *args, **kwags):self.__wrapped = aClass(*args, **kwags)def __getattr__(self, attr):trace('get:', attr)if failIf(attr):raise TypeError('Private attribute fetch:' + attr)else:return getattr(self.__wrapped, attr)def __setattr__(self, attr, value):trace('set:', attr, value)if attr == '_onInstance__wrapped':self.__dict__[attr] = valueelif failIf(attr):raise TypeError('Private attribute change:' + attr)else:setattr(self.__wrapped, attr, value)return onInstancereturn onDecoratordef Private(*attributes):return accessControl(failIf=(lambda attr: attr in attributes))def Public(*attributes):return accessControl(failIf=(lambda attr: attr not in attributes))

我们可以使用上述装饰器定义一个类并测试:

@Private('age')
class Person:def __init__(self, name, age):self.name = nameself.age = ageX = Person('Bon', 40)
print(X.name)
X.name = 'Sue'
print(X.name)

输出:

Bon
Sue

但以下输入将抛出异常:

X.age

输出:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Input In [49], in <cell line: 5>()3 X.name = 'Sue'4 print(X.name)
----> 5 X.ageInput In [47], in accessControl.<locals>.onDecorator.<locals>.onInstance.__getattr__(self, attr)13 trace('get:', attr)14 if failIf(attr):
---> 15     raise TypeError('Private attribute fetch:' + attr)16 else:17     return getattr(self.__wrapped, attr)TypeError: Private attribute fetch:age

同样,我们可以将使用Public装饰器进行测试,并将参数name设置为公有属性:

@Public('name')
class Person:def __init__(self, name, age):self.name = nameself.age = ageX = Person('Bon', 40)
print(X.name)
X.name = 'Sue'
print(X.name)
X.age

输出:

Bon
Sue
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Input In [52], in <cell line: 11>()9 X.name = 'Sue'10 print(X.name)
---> 11 X.ageInput In [47], in accessControl.<locals>.onDecorator.<locals>.onInstance.__getattr__(self, attr)13 trace('get:', attr)14 if failIf(attr):
---> 15     raise TypeError('Private attribute fetch:' + attr)16 else:17     return getattr(self.__wrapped, attr)TypeError: Private attribute fetch:age

参考文献:
[1] Mark Lutz. Python学习手册[M]. 机械工业出版社, 2018.

这篇关于系统学习Python——装饰器:“私有“和“公有“属性案例-[公有声明的推广]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/803249

相关文章

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、