python 私有属性_Python3伪私有属性

1:伪私有属性介绍

在Python中一切都是对象,并且类的所有属性和方法都是公有的(public),并不存在private 关键字来声明私有方法或属性。那么在Python中怎么实现像其他编程语言一样的私有属性呢?其实只需在属性前加上双下划线(但是结尾处不能有双下划线)即可,如:self.__name,这并不是真正私有,而是“伪私有”,因为Python会把self.__name 变为self._类名__name,你可以使用"对象._类名__name"访问这个属性。

# encoding=gbk class Test: def __init__(self,name): self.__name = name t = Test('ixusy88')print(t.__dict__) # 输出 {'_Test__name': 'ixusy88'};属性 __name 变为 _Test__name了# print(t.__name) # 输出:AttributeError: 'Test' object has no attribute '__name'; # 不能访问属性__name,因为属性 __name 变为 _Test__name了,不存在属性__name # 可以通过 对象._类名__属性 访问print(t._Test__name)# 通过下标访问print(t.__dict__['_Test__name'])

2:双下划线:伪私有属性实现过程

在运算符重载中有提到 __setattr__ 能够拦截所有的属性赋值操作,__getattr__能够拦截没有定义属性的访问(即不存在于

__dict__中的属性)。

其拦截过程如下:

self.属性 = 属性值 会调用 self.__setattr__('属性',属性值)

self.属性 = 属性值 会调用 self.__setattr__('_类__属性',属性值)

对象.属性 = 属性值 会调用 self.__setattr__('属性',属性值)

对象.属性 = 属性值 会调用 self.__setattr__('属性',属性值)

只拦截不处理:

# encoding=gbk class Test: def __init__(self,name,age): self.__name = name # self.__setattr__('_Test__name',name) self.age = age # self.__setattr__('age',age) def __getattr__(self, item): print('in __getattr__:' + item) def __setattr__(self, key, value): print('in __setattr__:' + key,value) def setV(self): self.__a1 = 'a1_11' # self.__setattr__('_Test__a1','a1_11') print('1:' + '*'*30)t = Test('ixusy88',18)print('2:' + '*'*30)print(t.__dict__) # 输出 {} ,因为在__setattr__中拦截了所有的属性赋值,print('3:' + '*'*30)t.setV()print('4:' + '*'*30)t.aa = '123' # self.__setattr__('aa','123')print('5:' + '*'*30)t.__bb = '123' # self.__setattr__('__bb','123')print('6:' + '*'*30)print(t.vv) # self.__getattr__('vv')print('7:' + '*'*30)print(t.age) # self.__getattr__('age') , 在构造函数中虽然有self.age 赋值,但是__getattr__会拦截所有,print('8:' + '*'*30)print(t.__dict__) # 输出 {} ,因为在__setattr__中拦截了所有的属性赋值, """输出结果:1:******************************in __setattr__:_Test__name ixusy88in __setattr__:age 182:******************************{}3:******************************in __setattr__:_Test__a1 a1_114:******************************in __setattr__:aa 1235:******************************in __setattr__:__bb 1236:******************************in __getattr__:vvNone7:******************************in __getattr__:ageNone8:******************************{}"""

正常拦截:

# encoding=gbk class Test: def __init__(self,name,age): self.__name = name # self.__setattr__('_Test__name',name) self.age = age # self.__setattr__('age',age) def __getattr__(self, item): print('in __getattr__:' + item) # raise TypeError('private attribute:' + item) # 抛出异常 def __setattr__(self, key, value): print('in __setattr__:' + key,value) self.__dict__[key] = value def setV(self): self.__a1 = 'a1_11' # self.__setattr__('_Test__a1','a1_11') print('1:' + '*'*30)t = Test('ixusy88',18)print('2:' + '*'*30)print(t.__dict__) # 输出 {'_Test__name': 'ixusy88', 'age': 18}print('3:' + '*'*30)t.setV()print('4:' + '*'*30)t.aa = '123' # self.__setattr__('aa','123')print('5:' + '*'*30)t.__bb = '123' # self.__setattr__('__bb','123')print('6:' + '*'*30)print(t.vv) # self.__getattr__('vv')print('7:' + '*'*30)print(t.age) # 直接输出 18,不会调用self.__getattr__('age') ,print('8:' + '*'*30)print(t.__dict__) # 输出 {'_Test__name': 'ixusy88', 'age': 18, '_Test__a1': 'a1_11', 'aa': '123', '__bb': '123'} """输出:1:******************************in __setattr__:_Test__name ixusy88in __setattr__:age 182:******************************{'_Test__name': 'ixusy88', 'age': 18}3:******************************in __setattr__:_Test__a1 a1_114:******************************in __setattr__:aa 1235:******************************in __setattr__:__bb 1236:******************************in __getattr__:vvNone7:******************************188:******************************{'_Test__name': 'ixusy88', 'age': 18, '_Test__a1': 'a1_11', 'aa': '123', '__bb': '123'}"""

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470540.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小工具:基于颜色的视频和图片切割

文章目录1 前言2 方案简述3 效果1 前言 最近做一个短视频相关的项目的时候,发现输入的视频有很多是有黑边的,有些可能是白边或者其他颜色的边。这对下游的模型处理有很大的影响。于是就写了一个自动判断填充边的颜色,并根据该颜色自动切割视…

二十六、PHP框架Laravel学习笔记——模型的一对多关联

二.一对多关联 一对多关联,本质上使用方法和一对一关联类似,内部实现略有不同; 创建另一个模型:book.php,我们看下这个表数据; PS:这里 user_id19 有三个,也就是蜡笔小…

论文阅读 - An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale

文章目录1 概述2 方法简述2.1 encoder之前2.2 encoder之后3 实验结果参考资料1 概述 这篇论文是一篇将tranformer引入到图像领域的里程碑式的文章。因为这是第一次在处理图像时,将所有的卷积模块统统抛弃,只使用attention。并且实验证明了只用attention…

数据仓库参考

虽然大多数看起来稀里糊涂&#xff0c;不过先留档&#xff0c;实践过程中再回头整理总结。 * 系统设计与架构笔记:ETL工具开发和设计的建议 * 数据仓库原理<2>&#xff1a;数据仓库系统的体系结构 * 数据仓库开发之路之一--准备工作转载于:https://www.cnblogs.com/oDora…

python五子棋人机对战_Python:游戏:五子棋之人机对战

原标题&#xff1a;Python&#xff1a;游戏&#xff1a;五子棋之人机对战 开端 画棋盘 首先肯定是要画出棋盘来&#xff0c;用 pygame 画出一个 19 19 或 15 15 的棋盘并不是什么难事&#xff0c;这在之前的文章中已经多次用到&#xff0c;就不赘述了。 画棋子 需要说一下的是…

二十七、PHP框架Laravel学习笔记——模型的多对多关联

二&#xff0e;多对多关联 多对多关联&#xff0c;比前面两种要复杂一些&#xff0c;需要一张中间表&#xff0c;共三张&#xff1b; (1) .users&#xff1a;用户表&#xff1b; (2) .roles&#xff1a;权限表&#xff1b; (3) .role_user&#xff1a;中间表&#xff1a;默…

论文阅读 - Is Space-Time Attention All You Need for Video Understanding?

文章目录1 概述2 模型结构2.1 模型输入2.2 attention模块2.3 分类模块3 模型分析3.1 不同attention方式3.2 不同的输入3.3 不同的模型3.4 不同的预训练数据3.5 不同的数据量3.6 position embedding的影响3.7 长输入时长3.8 不同的transformer3.9 不同的patch size3.10 attentio…

iOS中常见的6种传值方式,UIPageViewController

通过属性传值、方法传值、代理传值、Block传值、单例传值、通知传值6种方式进行不同视图之间的传值。不同方式只需要在AppDelegate中更改下UINavigationController的根控制器即可。使用很简单的实例让你很快理解不同的传值方式。 UIPageViewController(上传者&#xff1a;JoneJ…

websocket 获取ip_Spark+Kafka+WebSocket+eCharts实时分析-完全记录(1)

本系列内容&#xff1a;Kafka环境搭建与测试Python生产者/消费者测试Spark接收Kafka消息处理&#xff0c;然后回传到KafkaFlask引入消费者WebSocket实时显示版本&#xff1a;spark-2.4.3-bin-hadoop2.7.tgzkafka_2.11-2.1.0.tgz------------------------第1小节&#xff1a;Kaf…

二十八、PHP框架Laravel学习笔记——模型的关联查询

二&#xff0e;关联查询 前几篇博文&#xff0c;了解了三种基础的关联模型&#xff0c;并简单的进行查询&#xff1b;本节课&#xff0c;我们详细的了解更多的查询方案&#xff1b; //下面两种查询是一样的&#xff1b; $books User::find(19)->book; $books User::fin…

读书笔记第五章

开发板是开发和学习嵌入式技术的主要硬件设备&#xff0c;尽管可以在PC上开发Linux驱动&#xff0c;然后重新编译成ARM架构的Linux驱动模块。但最终都是要在开发板上测试的。主要是因为ARM架构的开发板基于X86架构的PC在CPU指令以及二进制格式上都有所不同。 …

搞懂CRF

文章目录1 前言2 Log-linear model3 MEMM3.1 模型概述3.2 label bias问题4 CRF4.1 模型概述4.2 模型训练4.3 模型解码4.4 小结参考资料1 前言 条件随机场(conditional random field, CRF)是在建立序列模型时的常用模块&#xff0c;它的本质就是描述观测到的序列xˉ\bar{x}xˉ对…

skywalking 安装_SkyWalking全链路追踪利器

随着目前系统架构的复杂度越来越高(中台、微服务)&#xff0c;并且线上应用的多级监控覆盖到了通讯、应用处理过程监控并且实现端到端的应用监测&#xff0c;线上性能故障的快速定位修复&#xff1b;而传统的监控分析方式已经无法满足我们的需求&#xff0c;因此许多强大的APM工…

二十九、PHP框架Laravel学习笔记——Debugbar 调试器

二&#xff0e;安装使用 通过 composer 在项目中安装 Debugbar&#xff0c;命令如下&#xff1a; composer require barryvdh/laravel-debugbar 生成一个配置文件&#xff0c;给用户配置&#xff0c;可以根据需求进行配置&#xff1b; php artisan vendor:publish --provider…

am335x reboot 命令分析

本文记录am335x运行reboot命令时&#xff0c;内核中运行过程。 Tony Liu, 2016-6-8, Shenzhen 参考链接&#xff1a;http://blog.csdn.net/wavemcu/article/details/8544333 kernel/sys.c void kernel_restart(char *cmd) {kernel_restart_prepare(cmd); …

论文阅读 - Video Swin Transformer

文章目录1 概述2 模型介绍2.1 整体架构2.1.1 backbone2.1.2 head2.2 模块详述2.2.1 Patch Partition2.2.2 3D Patch Merging2.2.3 W-MSA2.2.4 SW-MSA2.2.5 Relative Position Bias3 模型效果参考资料1 概述 Vision Transformer是transformer应用到图像领域的一个里程碑&#x…

rocketmq queue_RocketMQ 实战(三) - 消息的有序性

■ RocketMQ有序消息的使用1 为什么需要消息的有序性比如用户张三终于挣了一百存在在银行卡里存取款,对应两个异步的短信消息,肯定要保证先存后取吧,不然都没钱怎么发了取钱的消息呢! M1 - 存钱 M2 - 取钱而mq默认发消息到不同q显然是行不通的,会乱序 需要发往同一个q,先进先出…

三十、PHP框架Laravel学习笔记——模型的预加载

一&#xff0e;预加载 预加载&#xff0c;就是解决关联查询中产生的 N1 次查询带来的资源消耗我们要获取所有书籍的作者(或拥有者)&#xff0c;普通查询方案如下&#xff1a; //获取所有书籍列表 $books Book::all(); //遍历每一本书 foreach ($books as $book) { //每一本…

Spring3系列12-Spring AOP AspectJ

本文讲述使用AspectJ框架实现Spring AOP。 再重复一下Spring AOP中的三个概念&#xff0c; Advice&#xff1a;向程序内部注入的代码。Pointcut&#xff1a;注入Advice的位置&#xff0c;切入点&#xff0c;一般为某方法。Advisor&#xff1a;Advice和Pointcut的结合单元&#…

论文阅读:Spatial Transformer Networks

文章目录1 概述2 模型说明2.1 Localisation Network2.2 Parameterised Sampling Grid3 模型效果参考资料1 概述 CNN的机理使得CNN在处理图像时可以做到transition invariant&#xff0c;却没法做到scaling invariant和rotation invariant。即使是现在火热的transformer搭建的图…