一、私有变量的定义

在Python中,有以下几种方式来定义变量:

  • xx:公有变量
  • _xx:单前置下划线,私有化属性或方法,类对象和子类可以访问,from somemodule import *禁止导入
  • __xx:双前置下划线,私有化属性或方法,无法在外部直接访问(名字重整所以访问不到)
  • __xx__:双前后下划线,系统定义名字(不要自己发明这样的名字)
  • xx_:单后置下划线,用于避免与Python关键词的冲突

如以下例子所示,我在test类中定义了num,_num 和 __num三个属性,并创建了test的类对象t,对这三个属性进行访问,__num不能被访问到

  1. class test(object):
  2. def __init__(self):
  3. self.num = 10
  4. self._num = 20
  5. self.__num = 30
  6.  
  7. t = test()
  8. print(t.num) #
  9. print(t._num) #
  10. # 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文件,将下面代码复制进去:

  1. num = 10
  2. _num = 20
  3. __num = 30
  4.  
  5. def test():
  6. print("--test--")
  7.  
  8. def _test2():
  9. print("--test2--")
  10.  
  11. def __test3():
  12. print("---test3--")
  • 使用 from somemodule import * 进行导入,不能导入私有变量,结果如下:
  1. In [1]: from test import *
  2.  
  3. In [2]: num
  4. Out[2]: 10
  5.  
  6. In [3]: _num
  7. ---------------------------------------------------------------------------
  8. NameError Traceback (most recent call last)
  9. <ipython-input-3-6dd7111d6a95> in <module>()
  10. ----> 1 _num
  11.  
  12. NameError: name '_num' is not defined
  13.  
  14. In [4]: __num
  15. ---------------------------------------------------------------------------
  16. NameError Traceback (most recent call last)
  17. <ipython-input-4-f0ba2c4a214a> in <module>()
  18. ----> 1 __num
  19.  
  20. NameError: name '__num' is not defined
  21.  
  22. In [5]: test()
  23. --test--
  24.  
  25. In [6]: _test2()
  26. ---------------------------------------------------------------------------
  27. NameError Traceback (most recent call last)
  28. <ipython-input-6-d29889233d08> in <module>()
  29. ----> 1 _test2()
  30.  
  31. NameError: name '_test2' is not defined
  32.  
  33. In [7]: __test3()
  34. ---------------------------------------------------------------------------
  35. NameError Traceback (most recent call last)
  36. <ipython-input-7-17e592a156f3> in <module>()
  37. ----> 1 __test3()
  38.  
  39. NameError: name '__test3' is not defined
  • 使用 import somemodule 进行导入,能导入私有变量,结果如下:
  1. In [8]: import test
  2.  
  3. In [9]: test.num
  4. Out[9]: 10
  5.  
  6. In [10]: test._num
  7. Out[10]: 20
  8.  
  9. In [11]: test.__num
  10. Out[11]: 30
  11.  
  12. In [12]: test.test()
  13. --test--
  14.  
  15. In [13]: test._test2()
  16. --test2--
  17.  
  18. In [14]: test.__test3()
  19. ---test3--

三、对类中的私有属性进行操作的方法

如果你想对类中的私有属性进行操作时,有以下三种方法:

1、getter和setter:

添加getter和setter方法,类对象通过调用这两种方法来对私有属性进行操作

  1. class test(object):
  2. def __init__(self):
  3. self.__num = 10
  4.  
  5. def getNum(self):
  6. return self.__num
  7.  
  8. def setNum(self, value):
  9. self.__num = value
  10.  
  11. t = test()
  12. print(t.getNum()) #
  13. t.setNum(20)
  14. print(t.getNum()) #

  2、property方法

  1. class test(object):
  2. def __init__(self):
  3. self.__num = 10
  4.  
  5. def getNum(self):
  6. return self.__num
  7.  
  8. def setNum(self, value):
  9. self.__num = value
  10.  
  11. num = property(getNum,setNum)
  12.  
  13. t = test()
  14. print(t.num) #
  15. t.num = 20
  16. 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

  1. class test(object):
  2. def __init__(self):
  3. self.__num = 10
  4.  
  5. @property
  6. def num(self):
  7. return self.__num
  8.  
  9. @num.setter
  10. def num(self, value):
  11. self.__num = value
  12.  
  13. t = test()
  14. print(t.num) #
  15. t.num = 20
  16. print(t.num) #

关于@property,官方文档如下:

根据文档可得:

  • 我们可以把property()方法当成一个装饰器来使用,使用@property对方法进行装饰
  • 装饰器@property把方法x()转换成了与方法名同名的getter方法,"I'm the 'x' property."是property的doc参数
  • 调用方法和property()方法一样

我的Python学习笔记(三):私有变量的更多相关文章

  1. Python 学习笔记三

    笔记三:函数 笔记二已取消置顶链接地址:http://www.cnblogs.com/dzzy/p/5289186.html 函数的作用: 給代码段命名,就像变量給数字命名一样 可以接收参数,像arg ...

  2. python学习笔记三:函数及变量作用域

    一.定义 def functionName([arg1,arg2,...]): code 二.示例 #!/usr/bin/python #coding:utf8 #coding=utf8 #encod ...

  3. webdriver(python) 学习笔记三

    知识点:简单的对象定位 对象的定位应该是自动化测试的核心,要想操作一个对象,首先应该识别这个对象.一个对象就是一个人一样,他会有各种的特征(属性),如比我们可以通过一个人的身份证号,姓名,或者他住在哪 ...

  4. python学习笔记三--字典

    一.字典: 1. 不是序列,是一种映射, 键 :值的映射关系. 2. 没有顺序和位置的概念,只是把值存到对应的键里面. 3. 通过健而不是通过偏移量来读取 4. 任意对象的无序集合 5. 可变长,异构 ...

  5. Python学习笔记三

    一. 为什么要使用函数? 函数可以方便阅读代码. 函数可以减少重复代码. 函数可以减少管理操作,减少修改操作. 二. 函数分类: 内置函数:len()   sum()   max()   min() ...

  6. Python学习笔记——常量和变量

    数字常量 如下是python的一些常量表示形式: 2            整数 3.23            浮点数 52.3e-4        科学技术法表示的浮点数 -5 -4.6j     ...

  7. Python学习笔记一:变量、函数

    变量.函数是Python语言的最基本单元,下面是我作为初学者的当前理解,随着学习的深入今后会做刷新. 变量:表示操作对象是谁. 变量的方法:表示能做什么事情. 如何设计变量:先分析需要解决的问题,基于 ...

  8. python学习笔记三 文件操作(基础篇)

    文件操作 打开文件 open(name[,mode[,buffering]])   open函数使用一个文件名作为强制参数,然后返回一个文件对象.[python 3.5 把file()删除掉]   w ...

  9. python学习笔记三 深浅copy,扩展数据类型(基础篇)

    深浅copy以及赋值 对于字符串和数字而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. import copy n1 = #n1 = 'hahahaha' #赋值n2 = n1#浅co ...

  10. python学习笔记2(变量)

    变量是只不过保留的内存位置用来存储值,这意味着,当创建一个变量,那么它在内存中保留一些空间. Python是弱类型,无需明确指定变量类型,赋值的同时会自动声明类型. x = 1 y = 2.0 nam ...

随机推荐

  1. CSS3基础知识

    CSS3基础 1 样式表的使用 1.内联样式表. 只影响单个元素,常用于标签. <p style="color: aqua;font-size: 20px">This ...

  2. Mysql----关于内联,左联,右联,全联的使用和理解

    准备工作:新建两张表 表一:student 填充内容:编号,姓名,班级 表二:school 填充内容:编号,班级,专业 这两张表建好了,意为班级选课表,两张表没有任何主外键的关系,下面进行内联,左联, ...

  3. 修改Mac系统的文件权限

    修改Mac系统的文件权限 有时候,因为各种各样的需求Mac OS系统使用者需要修改某个系统文件,但是很多时候Mac OS系统会提示你"没有足够的权限".所以往往会无法保侟.编辑甚至 ...

  4. UICollectionView具体解释

    初始化部分: UICollectionViewFlowLayout *flowLayout= [[UICollectionViewFlowLayout alloc]init]; self.myColl ...

  5. linux中硬链接与软链接

    硬链接记录的是目标的inode,软链接记录的是目标的路径. 软链接就像快捷方式,而软链接就像备份.软链接能够做跨分区的链接,而硬链接因为inode的缘故,仅仅能在本分区中做链接,所以软链接使用很多其它 ...

  6. 基于MATLAB边缘检测算子的实现

    基于MATLAB边缘检测算子的实现 作者:lee神 1.   概述 边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点.图像属性中的显著变化通常反映了属性的重要 ...

  7. JAVA入门[17]-ControllerAdvice处理exception

    1.关于@ControllerAdvice @ControllerAdvice注解本身已经使用了@Component,因此@ControllerAdvice注解所标注的类将会自动被组件扫描获取到,就像 ...

  8. linux 磁盘管理三部曲——(2)管理分区,文件系统类型格式化

    上篇小编给大家讲解了磁盘结构和分区的介绍,这篇小编就给大家演示如何管理分区和文件系统类型格式化. 小编上篇已经提到如何使用磁盘,今天这两步,就是其中很重要的两步.(前几天写的有点急,有点乱,今天又整理 ...

  9. 使用Intellij IDEA的svn时提示出错:Can't use Subversion command line client: svn

    问题 原因是安装SVN的时候没有安装command-line功能,要单独安装VisualSVN 下载页面:http://subversion.apache.org/packages.html SVN1 ...

  10. Confluence 持续集成平台部署记录

    1.1 Confluence简介 Confluence是一个专业的企业知识管理与协同软件,也可以用于构建企业wiki.使用简单,但它强大的编辑和站点管理特征能够帮助团队成员之间共享信息.文档协作.集体 ...