python中的_xx, __xx, __xx__
一、从模块分析
######## 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__的更多相关文章
- Python中_,__,__xx__的区别
_xx 单下划线开头 Python中没有真正的私有属性或方法,可以在你想声明为私有的方法和属性前加上单下划线,以提示该属性和方法不应在外部调用.如果真的调用了也不会出错,但不符合规范. #! /usr ...
- Python中_,__,__xx__方法区别
_xx 单下划线开头 Python中没有真正的私有属性或方法,可以在你想声明为私有的方法和属性前加上单下划线,以提示该属性和方法不应在外部调用.如果真的调用了也不会出错,但不符合规范. 方法就是以单下 ...
- python中 _、__、__xx__() 区别及使用场景
1.访问权限(private.public)与继承方式(只有public继承) 在面向对象编程语言中,类的属性与方法都会设置访问控制权限,从而满足我们的设计需求.一般而言,我们通常会将对象的属性设置为 ...
- [Python]Python章1 Python中_的故事
_xx 单下划线开头 Python中没有真正的私有属性或方法,可以在你想声明为私有的方法和属性前加上单下划线,以提示该属性和方法不应在外部调用.如果真的调用了也不会出错,但不符合规范. 本文为译文,版 ...
- python _、__和__xx__的区别
python _.__和__xx__的区别 本文为译文,版权属于原作者,在此翻译为中文分享给大家.英文原文地址:Difference between _, __ and __xx__ in Pytho ...
- 对比Python中_,__,xx__xx
对比Python中_,__,xx__xx _ 的含义 不应该在类的外面访问,也不会被from M import * 导入. Python中不存在真正的私有方法.为了实现类似于c++中私有方法,可以 ...
- 接口测试基础——第7篇 Python中_、__、__func__之间的区别
今天的东西很少,主要是给自己做个笔记,顺便帮大家普及一下Python中的边角知识: 1.if __name__ == "__main__"是什么意思 答:一个.py文件,如果是自身 ...
- python _、__和__xx__的区别(转)
本位转载自:http://www.cnblogs.com/coder2012/p/4423356.html "_"单下划线 Python中不存在真正的私有方法.为了实现类似于c++ ...
- [转]Python中的str与unicode处理方法
早上被python的编码搞得抓耳挠腮,在搜资料的时候感觉这篇博文很不错,所以收藏在此. python2.x中处理中文,是一件头疼的事情.网上写这方面的文章,测次不齐,而且都会有点错误,所以在这里打算自 ...
随机推荐
- shrio学习笔记
Thymeleaf扩展坐标 <!--thyemleaf对shrio的扩展坐标--> <dependency> <groupId>com.github.thebora ...
- 长乐培训Day6
T1 数列 题目 [题目描述] [输入格式] [输出格式] [输入样例] [输出样例] [数据规模] 如上所述. 解析 身为T1,居然比T4还难......让我怎么办......以下为巨佬题解: 我猜 ...
- DjangoRestful 递归嵌套序列化器实现
**** 由于博客园不支持markdown语法,所以推荐以下链接阅读: 原创 https://blog.csdn.net/weixin_42495873/article/details/8943354 ...
- 如何加入 Skype for Business 会议?
参加一个线上培训,收到了Skype的参会地址,是这个样子的 然后就是一脸懵逼的不知道怎么参加会议了.找了半天终于在同事的帮助下参加成功. 我的参加方法:在Window上用Skype for Busin ...
- VSCode-设置webstorm的主题和快捷键
前提:VScode很火啊,理由:轻量,免费,不用找各种破解qi.... 好吧那我也从webstorm转过来试试,但是webstorm已经用了4年多了,对于一个有洁癖的人,必须把VScode打扮的和we ...
- Bigdecimal除法异常
1.异常信息摘要(详细请见文末): java.lang.ArithmeticException: Non-terminating decimal expansion; no exact represe ...
- Ubuntu下编译 Hadoop2.9
Ubuntu 下编译 Hadoop-2.9.2 系统环境 系统: ubuntu-18.10-desktop-amd64 maven: Apache Maven 3.6.0 jdk: jdk_1.8.0 ...
- springboot系列(八)springboot整合mybatis
本篇介绍一下在springboot中整合mybatis ,使用mysql数据库,集成durid 连接池技术,全部代码是手动生成,没有使用代码生成器来构建代码. 一.创建数据库和表 二.在pom中添加依 ...
- unittest 运行slenium(四)---通过指定用例的形式运行用例
一: 说明 跟数据驱动唯一的区别为用例数据获取时,及运行方式不同. 其它都基本相同,可参考https://www.cnblogs.com/xiaodingdong/p/11753220.html 二: ...
- spice在桌面虚拟化中的应用系列之一(spice简介,性能优化等)
1.spice介绍 1.1 spice简介 spice是由Qumranet开发的开源网络协议,2008年红帽收购了Qumranet获得了这个协议.SPICE是红帽在虚拟化领域除了KVM的又一“新兴技术 ...