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'}"""

python 私有属性_Python3伪私有属性相关推荐

  1. Python学习笔记(八)—— 私有属性、私有方法、伪私有

    在Python中,以下划线开头的变量名和方法名有特殊的含义,尤其在是在类的定义中.用下划线作为变量名和方法名的前缀和后缀来表示类的特殊成员. _xxx:这样的对象叫做保护成员,只有类对象和子类对象能访 ...

  2. 私有属性和方法-伪私有属性和方法

    class Women:def __init__(self, name):self.name = nameself.__age = 18def __secret(self):# 在对象的方法内部,是可 ...

  3. Python OOP:继承、单继承、多继承、__mro__、子类重写父类同名属性和方法、子类调用父类同名属性和方法、多层继承、super()、私有(实例)属性和方法、获取修改私有属性值、私有类属性

    一.继承 Python⾯向对象的继承指的是多个类之间的所属关系,即⼦类默认继承⽗类的所有属性和⽅法. 继承作用:继承可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展. 在P ...

  4. php protected 属性,PHP实现在对象之外访问其私有属性private及保护属性protected的方法...

    本文实例讲述了PHP实现在对象之外访问其私有属性private及保护属性protected的方法.,具体如下: public 表示全局的访问权限,类内部外部子类都可以访问: private表示私有的访 ...

  5. 学习IOS开问题篇--视图的模型控件属性写在私有分类中的原因

    写在私有分类中就是私有的 ,只能当前类访问. 写在interface中也就是头文件中是公开的,别人只要导入头文件就可以访问. xcode5之后苹果推荐我们将控件的属性写在私有分类中封装起来.避免外界直 ...

  6. c/c++教程 - 2.4.1 类和对象,封装,class和struct的区别,成员属性设为私有,类拆分成.h.c文件编写方法

    目录 4. 类和对象 4.1 封装 4.1.1 封装的意义 4.1.2 class和struct的区别 4.1.3 成员属性设置为私有 4.1.4 类拆分成.h.c编写方法 相关教程 4. 类和对象 ...

  7. Swift:带有私有设置方法的公有属性

    作者:Thomas Hanning,原文链接,原文日期:2015-12-24 译者:小袋子:校对:lfb_CD:定稿:Cee Swift 可以很方便地创建带有私有设置方法的公有属性.这可以让你的代码更 ...

  8. Python属性和内建属性

    属性property 1. 私有属性添加getter和setter方法 class Money(object):def __init__(self):self.__money = 0def getMo ...

  9. python完全支持面向对象编程思想_面向对象的编程思想和Python的类,访问和属性,继承...

    本文将从访问限制,属性,继承,方法重写这几个方面继续介绍面向对象的编程思想和Python类的继承. 复制代码 一.访问权限: Python中在类的内部定义属性和方法,在类的外部是可以直接调用或进行访问 ...

最新文章

  1. Delphi中点击DBGrid某一行获得其详细数据方法
  2. STM32(三)-------流水灯(标准库函数)
  3. python 图片数据增强_数据增强之批量修改图像尺寸大小(附Python实现)
  4. spring学习笔记(六)
  5. 《Java就业培训教程》_张孝祥_书内源码_06
  6. h5 前端 PHP,十分钟搞定微信H5支付(ThinkPHP5.1)
  7. 点击验证码时候自动刷新功能
  8. 简单明了的普利姆算法
  9. pwlink用作USB转TTL,进入HC-05的AT模式
  10. 二叉树的深度(前序 中序 后序 递归非递归搜素)、广度、搜索 C++
  11. 重庆SEO优化:网站通过SEO优化会有哪些好处以及【SEO优化】 深度了解蜘蛛spider抓取原理-专业SEO技术教程
  12. MySQL - CALL 语句
  13. python换脸GIF动画制作
  14. 微信小程序 基础语法
  15. 【Python爬虫实战】用urllib与服务端交互(发送和接收数据)
  16. 有了这个Python库,再也不愁给孩子起名字了
  17. 【华为OD机试真题2023 JAVA】硬件产品销售方案
  18. Qt之超简单的TCP通信(自定义TCP通信类,含源码+注释)
  19. 解决KEEL闪退问题
  20. spring异常java.lang.IllegalStateException

热门文章

  1. 学成在线--19.新增课程(数据字典)
  2. wordpress 评论ajax,WordPress教程 WordPress实现提交评论ajax翻页效果教程
  3. 计算机操作系统指导书,《计算机操作系统》实验指导书-2015
  4. 荣耀magic3会用鸿蒙,赵明:荣耀Magic3芯片领先行业,大家看到以后会换掉手机!...
  5. 如何理解操作系统的不确定性_温度最低-273度,最高却能有1.4亿亿亿亿度,如何定义的?...
  6. 【教程分享】Jmeter入门教程
  7. oracle 试图访问已经在使用的事物处理临时表,解决ORA-14450:试图访问已经在使用的事务处理临时表-Oracle...
  8. LeetCode7——Reverse Integer(将一个整数反转,注意溢出的处理)
  9. 《跟我一起写Makefile》读书笔记(2)
  10. 字符串处理问题[2]:将一个数字型…