Python面向对象中的“私有化”

Python并不直接支持私有方式,而要靠程序员自己把握在外部进行特性修改的时机。

为了让方法或者特性变为私有(从外部无法访问),只要在它的名字前面加上双下划线即可。

由双下划线 __ 开始的属性在运行时被“混淆”,所以直接访问是不允许的。

实际上,在 Python 带有双下划线的属性或方法并非正真意义上的私有,它们仍然可以被访问。

在类的内部定义中,所有以双下划线开始的名字都被“翻译”成前面加上单下划线和类名的形式。

示例:

>>> class TestObj(object):
...     __war = "world"
...
...     def __init__(self):
...         self.__har = "hello"
...
...     def __foo(self):
...         print(self.__har + self.__war)
...
...
...
>>> t = TestObj()>>> dir(t) # 拿到t里面的所有方法
['_TestObj__foo', '_TestObj__har', '_TestObj__war', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getat
tribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__
', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']>>> t.__war
Traceback (most recent call last):File "<input>", line 1, in <module>t.__war
AttributeError: 'TestObj' object has no attribute '__war'>>> t.__har
Traceback (most recent call last):File "<input>", line 1, in <module>t.__har
AttributeError: 'TestObj' object has no attribute '__har'>>> t.foo()
Traceback (most recent call last):File "<input>", line 1, in <module>t.foo()
AttributeError: 'TestObj' object has no attribute 'foo'>>> t._TestObj__war
'world'>>> t._TestObj__har
'hello'>>> t._TestObj__foo()
helloworld

转载于:https://www.cnblogs.com/bigtreei/p/9029528.html

Python面向对象中的“私有化”相关推荐

  1. Python面向对象中反射和双下的正确用法

    一.反射 反射:程序可以访问,检测和修改它本身状态或行为的一种能力(自省) python面向对象中的反射:通过字符串的形式操作对象相关的属性 python中的一切事物都是对象(都可以使用反射) 四个可 ...

  2. Python面向对象中super用法与MRO机制

    1. 引言 最近在研究django rest_framework的源码,老是遇到super,搞得一团蒙,多番查看各路大神博客,总算明白了一点,今天做一点总结. 2. 为什么要用super 1)让代码维 ...

  3. python面向对象中的私有属性和私有化方法

    xx: 公有变量 (公有) _x: 单前置下划线,私有化属性或方法,from somemodule import *禁止导入,类对象和子类可以访问 __xx:双前置下划线,避免与子类中的属性命名冲突, ...

  4. Python 面向对象(中)

    在python中面向对象的三大特征: 封装,继承,多态 1. 析构方法 程序结束后,之后调用析构方法,来释放空间 def __del__(self):print("析构方法") 2 ...

  5. Python面向对象中:__init__() 构造方法

    什么是构造方法 在创建类时, 可手动添加一个 __init__()方法,称为构造方法,这是一个实例方法 构造方法用于创建实例对象时使用,每当创建一个类的实例对象时,Python 解释器都会自动调用它 ...

  6. Python面向对象中的self到底是什么?

    初次接触类的概念,在学习的网页上,对self的解释是self是方法的一个参数,在方法调用的时候,这个参数是默认传参数的 我们看一个例子 很多人学习python,不知道从何学起. 很多人学习python ...

  7. 请解释python面向对象中的继承

    解释继承 一个类继承自另一个类,也可以说是一个孩子类/派生类/子类,继承自父类/基类/超类,同时获取所有的类成员(属性和方法). 继承使我们可以重用代码,并且还可以更方便地创建和维护代码.Python ...

  8. python面向对象中方法重写class Person (object):#说明Person继承object类 def __init__(self,name,age): sel

    (承接上次的知识学习) 首先给出方法重写的定义: 1.如果子类对继承自父类的某个属性或方法不满意,可以在子类中对其(方法体)进行重新编写: 2.子类重写后的方法可以通过super().xxx()调用父 ...

  9. python面向对象中的类

    1.  类的构成 类(Class) 由3个部分构成: 类的名称:类名: 类的属性:一组数据: 类的方法:允许对进行操作的方法 (行为) 列如,--人类的设计: 人类的设计我们只关心三样东西: 事物名称 ...

最新文章

  1. Javabean学习纪要
  2. 你随便动幕布,投影跟不上算我输,动态投影黑科技,AE特效秒变成真
  3. java io读取doc内容_Java word 内容读取-Go语言中文社区
  4. 从零开始学 Java - Spring MVC 统一异常处理
  5. spring事务管理-概念部分
  6. 在SE37里批量执行ABAP函数
  7. 如何在Ubuntu上轻松安装Oracle Java
  8. 租金 预测_如何预测租金并优化租赁期限,从而节省资金
  9. node.js更新升级(Mac与Windows)- 总结篇
  10. 史上最全!计算机科学领域顶会最佳论文大合集:微软研究院最多,清华排24...
  11. 数据库每日一题 2020.04.30
  12. 6.FreeRTOS学习笔记-信号量
  13. 在哪里学python-为什么要选择学python,亮点在哪呢?
  14. 防火墙状态检测及会话表技术
  15. LINUX搭建EtherPad环境
  16. DateUtils封装
  17. 布衣联盟装机常用软件光盘——金鼠报春版
  18. win10计算机还原点如何创建,win10系统创建还原点及系统还原的操作方法
  19. C++(电子)PPT例6、例7作业提交
  20. C++中的CopyElision

热门文章

  1. 影像科dsa为什么必须买维修保险_DSA在医疗方面为什么重要?看这3点
  2. php 说说,PHP程序员:你过来,给我说说 $this,self,static 有什么区别?
  3. grpc python 负载均衡_Ambassador 0.52 新特性:会话亲和性、负载均衡控制、gRPC-Web
  4. Python爬虫之(七)数据提取-正则表达式
  5. 机器人水库涵洞检测_管渠清淤机器人、管道浑水探测机器人……想不到吧?哈排水集团竟然是“科研达人”...
  6. 笔记+R︱信用风险建模中神经网络激活函数与感知器简述
  7. [spark]Spark2.4.6用bulkload写入Hbase1.3.1表的多列
  8. ThreadLocalConnection
  9. cacti设置redis监控端口
  10. os10.10上versions崩溃的问题解决