系统学习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

相关文章

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

Python包管理工具pip的升级指南

《Python包管理工具pip的升级指南》本文全面探讨Python包管理工具pip的升级策略,从基础升级方法到高级技巧,涵盖不同操作系统环境下的最佳实践,我们将深入分析pip的工作原理,介绍多种升级方... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v