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

Python面向对象中的“私有化”的更多相关文章

  1. Python面向对象中的继承、多态和封装

    Python面向对象中的继承.多态和封装 一.面向对象的三大特性 封装:把很多数据封装到⼀个对象中,把固定功能的代码封装到⼀个代码块, 函数,对象, 打包成模块. 这都属于封装思想. 继承:⼦类可以⾃ ...

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

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

  3. 【转】python面向对象中的元类

    type() 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个Hello的class,就写一个hello.py模块: class Hel ...

  4. python面向对象中的__init__方法怎么理解?

    我们在学习python类的时候,总会碰见书上的类中有__init__()这样一个函数,很多同学百思不得其解,其实它就是python的构造方法. 构造方法类似于类似init()这种初始化方法,来初始化新 ...

  5. Python面向对象中的类和对象

    类和对象 目标 类和对象的概念 类和对象的关系 类的设计 01. 类和对象的概念 类 和 对象 是 面向对象编程的 两个 核心概念 1.1 类 类 是对一群具有 相同 特征 或者 行为 的事物的一个统 ...

  6. python面向对象中的一些特殊__方法__

    1. __doc__ 表示类的描述信息 class Foo: """ 描述类信息""" def func(self): pass print ...

  7. 47、Python面向对象中的继承有什么特点?

    继承的优点: 1.建造系统中的类,避免重复操作. 2.新类经常是基于已经存在的类,这样就可以提升代码的复用程度. 继承的特点: 1.在继承中基类的构造(__init__()方法)不会被自动调用,它需要 ...

  8. python面向对象中的封装、继承、多态

    封装 可以简单的理解为隐藏一切可以隐藏的实现细节,只向外界提供简单的编程接口.我们在类中定义的方法其实就是把数据和数据的操作封装起来了,在我们创建了对象之后,只需要给对象发送一个消息(调用方法)就可以 ...

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

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

随机推荐

  1. thread_CountDownLatch同步计数器

    CountDownLatch类是一个同步计数器,构造时传入int参数,该参数就是计数器的初始值,每调用一次countDown()方法,计数器减1,计数器大于0 时,await()方法会阻塞程序继续执行 ...

  2. Ubuntu下键盘输入错乱问题,输入双引号输出的是@符号,输入#号输出的是未知语言的字符

    装完搜狗后,键盘开始出现混乱,切换到英文输入法,输入双引号输出的是@符号,输入#号输出的是未知语言的字符. 网上有的说在 system - keyboard - Input Source 下看看是否是 ...

  3. 【问题记录】javaweb项目的jar无法识别注解的bean

    问题:eclipse中javaweb项目,打成jar包供其它项目使用,发现无法识别使用注解的bean. 原因参考: http://blog.csdn.net/wangpeng047/article/d ...

  4. Jquery学习笔记(11)--jquery的ajax删除用户,非常简单!

    jquery的ajax,简直简单!!只要一个$.get(url,map,function)就搞定了! index.php: <!DOCTYPE html> <html lang=&q ...

  5. nginx+tomcat多节点部署

    在一台机器上想要将一个应用程序部署多个节点,可以通过nginx来实现. 1.将tomcat复制多份,修改tomcat配置文件conf/server.xml,将端口号设置成不一样的 2.将多个tomca ...

  6. STL源代码剖析——STL算法stl_algo.h

    前言 在前面的博文中剖析了STL的数值算法.基本算法和set集合算法.本文剖析STL其它的算法,比如排序算法.合并算法.查找算法等等.在剖析的时候.会针对函数给出一些样例说明函数的使用.源代码出自SG ...

  7. Unix系统编程()main函数的命令行参数

    命令行参数输入双引号是什么效果? 好像可以去空格化.

  8. C#关键字之Partial详解

    Partial是局部类型的标志.局部类型可以实现将一个类.结构或接口分成几个部分,分别放在在几个不同的.cs文件中(当然也可以放在同一个.cs文件中).在程序进行编译之后,将会合并成一个完整的类.因此 ...

  9. jfinal_BLOG v1.0

    http://git.oschina.net/fleam/jfinal_AmazeUI

  10. 描述JSP和Servlet的区别、共同点、各自应用的范围

    描述JSP和Servlet的区别.共同点.各自应用的范围 解答:JSP在本质上就是SERVLET,但是两者的创建方式不一样.Servlet完全是JAVA程序代码构成,擅长于流程控制和事务处理,通过Se ...