一、从模块分析

########  bb.py (一个用来导入的模块) ##########

var = 0
_var = 1
__var = 2
__var__ = 3

1. from module import *

########### aa.py ###########

from bb import *

print var       #ok

print _var

print __var

print __var__

$python aa.py

只有print var可以正确执行,其它都会报NameError: "xxx" not defined,

即,只要模块成员名之前有一条,两条下划线,都不能通过from module import * 语句导入当前模块中

2. from module import xx,

########### aa.py ###########

from bb import var, _var, __var, __var__

print var

print _var

print __var      

print __var__

$python aa.py

此时,四条print语句都可以正常执行,可见,通过 import 某个模块中的具体成员,可以消除模块成员的私有性,使得私有成员也可以在当前模块中可见

3. import module

########### aa.py ###########

import bb

print bb.var

print bb._var

print bb.__var      

print bb.__var__

$python aa.py

此时,四条print语句都可以正常执行,可见,通过导入模块名,然后利用模块名加句点操作符的方式,也可以访问被导入模块的私有成员

二、从python类的角度分析

__xx__ 一般是类中的特殊成员,另有他用,我们编写代码的时候,最好不要以这样的方式命名函数,或者变量

############ classtest.py (用来分析类成员的可见性)###############

class Father(object):

  s = 0

  _s = 1

  __s = 2

  def __init__(self):

    self.a = 0

    self._a = 1

    self.__a = 2

    self.__a__ = 3

  def __getA__(self):

    return self.__a__

class Child(Father):

  def __init__(self):

    super(Child, self).__init__()

程序段一:测试类成员对于类对象的可见性

father = Father()

print father.a        #ok

print father._a      #ok,但是在C++中是不能这样访问的

print father.__a    #error

__a相当于类Father的私有成员,_a相当于类Father的受保护成员(我在很多论坛里都有看到有这种说法,即,单下划线开头的类成员是受保护的),

通过和C++的比较,受保护的类成员,在C++中是没法通过类对象直接用句点操作符来引用的,python的受保护,没有C++那么严格

程序段二:测试父类私有成员对子类对象的可见性

child = Child()

print child.a            #ok

print child._a          #ok,同样的,在C++中是不可访问的

print child.__a        #error

程序段三:测试类的静态成员可见性

father = Father()

print father.s          #ok

print father._s        #ok

print father.__s      #error

print Father.s        #ok

print Father._s      #ok

print Father.__s    #error

程序段四:测试类的静态成员在子类中的可见性

child =Child()

print child.s        #ok

print child._s      #ok

print child.__s    #error

print Child.s       #ok

print Child._s     #ok

print Child.__s   #error

程序段五:终极测试,深度破坏类成员私密性

如果想访问类的__xx这样的私有成员,可以有如下变态的方法,不过这种方法最好不要用在实际开发中

例如上面的Father类,有一个私有成员__a,可以通过加上_Father前缀,使得类对象可以通过句点操作符直接访问

father = Father()

print father._Father__a   #ok

father._Father__a = 3    #ok

child = Child()

print child._Father__a    #ok

print child._Child__a      #error,__a是继承自Father类,因此,不能这样访问

程序段六:补充测试,测试类中以双下划线开头,以双下划线结尾的特殊类成员

father = Father()

print father.__a__    #ok

print father.__getA__()  #ok

__a__数据成员,__getA__()成员函数,它们都是双下划线开头,双下划线结尾,这样的命名方式,代表它们是类的特殊成员,一般情况下定制类的时候,可以实现__xx__()这样的特殊函数

python中的_xx, __xx, __xx__的更多相关文章

  1. Python中_,__,__xx__的区别

    _xx 单下划线开头 Python中没有真正的私有属性或方法,可以在你想声明为私有的方法和属性前加上单下划线,以提示该属性和方法不应在外部调用.如果真的调用了也不会出错,但不符合规范. #! /usr ...

  2. Python中_,__,__xx__方法区别

    _xx 单下划线开头 Python中没有真正的私有属性或方法,可以在你想声明为私有的方法和属性前加上单下划线,以提示该属性和方法不应在外部调用.如果真的调用了也不会出错,但不符合规范. 方法就是以单下 ...

  3. python中 _、__、__xx__() 区别及使用场景

    1.访问权限(private.public)与继承方式(只有public继承) 在面向对象编程语言中,类的属性与方法都会设置访问控制权限,从而满足我们的设计需求.一般而言,我们通常会将对象的属性设置为 ...

  4. [Python]Python章1 Python中_的故事

    _xx 单下划线开头 Python中没有真正的私有属性或方法,可以在你想声明为私有的方法和属性前加上单下划线,以提示该属性和方法不应在外部调用.如果真的调用了也不会出错,但不符合规范. 本文为译文,版 ...

  5. python _、__和__xx__的区别

    python _.__和__xx__的区别 本文为译文,版权属于原作者,在此翻译为中文分享给大家.英文原文地址:Difference between _, __ and __xx__ in Pytho ...

  6. 对比Python中_,__,xx__xx

      对比Python中_,__,xx__xx _ 的含义 不应该在类的外面访问,也不会被from M import * 导入. Python中不存在真正的私有方法.为了实现类似于c++中私有方法,可以 ...

  7. 接口测试基础——第7篇 Python中_、__、__func__之间的区别

    今天的东西很少,主要是给自己做个笔记,顺便帮大家普及一下Python中的边角知识: 1.if __name__ == "__main__"是什么意思 答:一个.py文件,如果是自身 ...

  8. python _、__和__xx__的区别(转)

    本位转载自:http://www.cnblogs.com/coder2012/p/4423356.html "_"单下划线 Python中不存在真正的私有方法.为了实现类似于c++ ...

  9. [转]Python中的str与unicode处理方法

    早上被python的编码搞得抓耳挠腮,在搜资料的时候感觉这篇博文很不错,所以收藏在此. python2.x中处理中文,是一件头疼的事情.网上写这方面的文章,测次不齐,而且都会有点错误,所以在这里打算自 ...

随机推荐

  1. React项目使用React-Router

    ⒈初始化React项目(略) 请参考 初始化一个React项目(TypeScript环境) ⒉集成React-Router 在React世界里,公认最好用的路由是React-Router.那我们直接来 ...

  2. CentOS 7 下安装 MySQL 5.7

    从 CentOS 7 系统开始,MariaDB 成为 yum 源中默认的数据库安装包.在 CentOS 7 及以上的系统中使用 yum 安装 MySQL 包将无法使用 MySQL.您可以选择使用完全兼 ...

  3. 往List集合循环add(对象)得到的是重复对象

    记录每次的错误,强大是慢慢的积累,先看看代码, 往list中循环添加RoleKungFu对象,看似没有问题,结果打印则显示: 全部是重复的数据!这是因为啥呢,因为将对象add入list中时,放入lis ...

  4. Struts笔记5

    文件下载 1.写action类 package com.gyf.web.action; import java.io.File; import java.io.FileInputStream; imp ...

  5. Scratch(四)舞台区详解

    在Scratch里面,所有的表现结果都在“舞台区”呈现,前面我们学习的“石头剪刀布”游戏,也是在“舞台区”完成的. 舞台区是非常重要的区域,所以我们今天单独用一个章节来详细说说这个舞台. 既然是一个舞 ...

  6. 百人研发团队的难题:研发管理、绩效考核、组织文化和OKR

    分享一个公司规模近200,研发占一半的创业公司 Worktile 在研发团队管理方面的玩法,仅供百人左右研发团队参考~ 什么是研发团队?简单的说,你熟悉的那帮穿格子衬衫,以程序员为核心组成的团队,就是 ...

  7. hdu 1342.. 复习广搜 顺便练习一下一个脑残的格式

    In a Lotto I have ever played, one has to select 6 numbers from the set {1,2,...,49}. A popular stra ...

  8. Asp.netCore 是用的Socket 吗?

    Asp.netCore 是用的Socket 的krestrel 用的是Socket! public static IWebHostBuilder CreateDefaultBuilder(string ...

  9. JavaScript获取页面元素的常用方法

    1.通过标签获取元素,返回一个数组 var li = document.getElementsByTagName('li');//标签获取元素 li[0].innerHTML;// 查看获取元素的内容 ...

  10. jQuery笔试题汇总整理

    1 你在公司是怎么用jquery的? 答:在项目中是怎么用的是看看你有没有项目经验(根据自己的实际情况来回答) 你用过的选择器啊,动画啊,表单啊,ajax事件等 配置Jquery环境 下载jquery ...