我的Python学习笔记(三):私有变量
一、私有变量的定义
在Python中,有以下几种方式来定义变量:
- xx:公有变量
- _xx:单前置下划线,私有化属性或方法,类对象和子类可以访问,from somemodule import *禁止导入
- __xx:双前置下划线,私有化属性或方法,无法在外部直接访问(名字重整所以访问不到)
- __xx__:双前后下划线,系统定义名字(不要自己发明这样的名字)
- xx_:单后置下划线,用于避免与Python关键词的冲突
如以下例子所示,我在test类中定义了num,_num 和 __num三个属性,并创建了test的类对象t,对这三个属性进行访问,__num不能被访问到
class test(object):
def __init__(self):
self.num = 10
self._num = 20
self.__num = 30 t = test()
print(t.num) #
print(t._num) #
# print(t.__num) # AttributeError: 'test' object has no attribute '__num'
可以使用命令dir查看t中的属性和方法,__num的名字已经被重整为“_test__num”了,可以使用t._test__num对__num进行访问
注:虽然私有变量可以通过_类名__变量名来访问,但强烈建议不要这样做
二、使用不同方法导入模块,模块中私有变量的使用区别
在使用不同方法导入模块后,是否能使用模块中的私有属性和方法,有以下两种情况
- 在使用 from somemodule import * 导入模块的情况下,不能导入或使用私有属性和方法
- 在使用 import somemodule 导入模块的情况下,能导入并使用私有属性和方法
首先我们先创建一个test.py文件,将下面代码复制进去:
num = 10
_num = 20
__num = 30 def test():
print("--test--") def _test2():
print("--test2--") def __test3():
print("---test3--")
- 使用 from somemodule import * 进行导入,不能导入私有变量,结果如下:
In [1]: from test import * In [2]: num
Out[2]: 10 In [3]: _num
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-3-6dd7111d6a95> in <module>()
----> 1 _num NameError: name '_num' is not defined In [4]: __num
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-4-f0ba2c4a214a> in <module>()
----> 1 __num NameError: name '__num' is not defined In [5]: test()
--test-- In [6]: _test2()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-6-d29889233d08> in <module>()
----> 1 _test2() NameError: name '_test2' is not defined In [7]: __test3()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-7-17e592a156f3> in <module>()
----> 1 __test3() NameError: name '__test3' is not defined
- 使用 import somemodule 进行导入,能导入私有变量,结果如下:
In [8]: import test In [9]: test.num
Out[9]: 10 In [10]: test._num
Out[10]: 20 In [11]: test.__num
Out[11]: 30 In [12]: test.test()
--test-- In [13]: test._test2()
--test2-- In [14]: test.__test3()
---test3--
三、对类中的私有属性进行操作的方法
如果你想对类中的私有属性进行操作时,有以下三种方法:
1、getter和setter:
添加getter和setter方法,类对象通过调用这两种方法来对私有属性进行操作
class test(object):
def __init__(self):
self.__num = 10 def getNum(self):
return self.__num def setNum(self, value):
self.__num = value t = test()
print(t.getNum()) #
t.setNum(20)
print(t.getNum()) #
2、property方法
class test(object):
def __init__(self):
self.__num = 10 def getNum(self):
return self.__num def setNum(self, value):
self.__num = value num = property(getNum,setNum) t = test()
print(t.num) #
t.num = 20
print(t.num) #
关于property方法,我们来看下官方文档:

由文档可得:
- property方法包含四个参数,分别为fget,fset,fdel,doc,分别对应getter方法,setter方法,deleter方法和方法说明
- property()方法返回一个property属性,如果c是C的实例,那么c.x会调用getter方法,c.x = value会调用setter方法,而del c.x会调用deleter方法
3、@property
class test(object):
def __init__(self):
self.__num = 10 @property
def num(self):
return self.__num @num.setter
def num(self, value):
self.__num = value t = test()
print(t.num) #
t.num = 20
print(t.num) #
关于@property,官方文档如下:

根据文档可得:
- 我们可以把property()方法当成一个装饰器来使用,使用@property对方法进行装饰
- 装饰器@property把方法x()转换成了与方法名同名的getter方法,"I'm the 'x' property."是property的doc参数
- 调用方法和property()方法一样
我的Python学习笔记(三):私有变量的更多相关文章
- Python 学习笔记三
笔记三:函数 笔记二已取消置顶链接地址:http://www.cnblogs.com/dzzy/p/5289186.html 函数的作用: 給代码段命名,就像变量給数字命名一样 可以接收参数,像arg ...
- python学习笔记三:函数及变量作用域
一.定义 def functionName([arg1,arg2,...]): code 二.示例 #!/usr/bin/python #coding:utf8 #coding=utf8 #encod ...
- webdriver(python) 学习笔记三
知识点:简单的对象定位 对象的定位应该是自动化测试的核心,要想操作一个对象,首先应该识别这个对象.一个对象就是一个人一样,他会有各种的特征(属性),如比我们可以通过一个人的身份证号,姓名,或者他住在哪 ...
- python学习笔记三--字典
一.字典: 1. 不是序列,是一种映射, 键 :值的映射关系. 2. 没有顺序和位置的概念,只是把值存到对应的键里面. 3. 通过健而不是通过偏移量来读取 4. 任意对象的无序集合 5. 可变长,异构 ...
- Python学习笔记三
一. 为什么要使用函数? 函数可以方便阅读代码. 函数可以减少重复代码. 函数可以减少管理操作,减少修改操作. 二. 函数分类: 内置函数:len() sum() max() min() ...
- Python学习笔记——常量和变量
数字常量 如下是python的一些常量表示形式: 2 整数 3.23 浮点数 52.3e-4 科学技术法表示的浮点数 -5 -4.6j ...
- Python学习笔记一:变量、函数
变量.函数是Python语言的最基本单元,下面是我作为初学者的当前理解,随着学习的深入今后会做刷新. 变量:表示操作对象是谁. 变量的方法:表示能做什么事情. 如何设计变量:先分析需要解决的问题,基于 ...
- python学习笔记三 文件操作(基础篇)
文件操作 打开文件 open(name[,mode[,buffering]]) open函数使用一个文件名作为强制参数,然后返回一个文件对象.[python 3.5 把file()删除掉] w ...
- python学习笔记三 深浅copy,扩展数据类型(基础篇)
深浅copy以及赋值 对于字符串和数字而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. import copy n1 = #n1 = 'hahahaha' #赋值n2 = n1#浅co ...
- python学习笔记2(变量)
变量是只不过保留的内存位置用来存储值,这意味着,当创建一个变量,那么它在内存中保留一些空间. Python是弱类型,无需明确指定变量类型,赋值的同时会自动声明类型. x = 1 y = 2.0 nam ...
随机推荐
- 【docker 一】入门实践、环境部署、基本操作指令、镜像库、数据卷
简述 `docker是如火如荼的容器技术,今后会陆续上传关于微服务技术的学习笔记,希望能和大家一起学习一起分享!` docker环境搭建 1.获取最新版的Docker安装包 $ wget -qO- h ...
- NS3网络仿真(10): 解析以太网帧
快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载.但请保留作者信息 解析以太网帧的过程是构建以太网帧的逆过程,当我们接收到一个以太网帧时,仍然以上一节中的ARP帧为例 ...
- EasyUI实现异步载入tree(整合Struts2)
首先jsp页面有一ul用于展现Tree <ul id="mytree"></ul> 载入Tree <script type="text/ja ...
- Woody的Python学习笔记1
Python 是一种解释性语言:这意味着开发过程中省去了编译这个环节,类似于PHP\Perl. Python 是交互式语言:这意味着你能够在一个python提示符,直接互动运行写你的程序. Pytho ...
- 初识homebrew
homebrew是MAC上的一个包管理工具,用于软件安装,非常方便. homebrew安装: 命令行执行: ruby -e "$(curl -fsSL https://raw.githubu ...
- redis参数配置说明
参数说明redis.conf 配置项说明如下:1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no2. 当Redis以守护进程方式运行 ...
- 判断json数据是否包含key
1.("key" in jsonObj) 如果有返回true 没有返回false 2.jsonObj.hasOwnProperty("key") 如果有返回tr ...
- FileSystemWatcher类监控文件的更改状态并且实时备份文件
首先这是我自己在一个任务需求里面所要用到的,大致的代码如下:我把监视文件和备份文件的方法封装到一个WatcherAndBackup 类中了,但是总感觉封装的不是很好,有大牛能够指出改正之处在此留言,谢 ...
- bzoj 3528: [Zjoi2014]星系调查
Description 银河历59451年,在银河系有许许多多已被人类殖民的星系.如果想要在行 星系间往来,大家一般使用连接两个行星系的跳跃星门. 一个跳跃星门可以把 物质在它所连接的两个行星系中互 ...
- rtmp指令解释--转
指令 Core rtmp 语法:rtmp { ... } 上下文:根 描述:保存所有 RTMP 配置的块. server 语法:server { ... } 上下文:rtmp 描述:声明一个 RTMP ...