一、私有变量的定义

在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 = 10self._num = 20self.__num = 30t = test()
print(t.num)    # 10
print(t._num)   # 20
# 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 = 30def test():print("--test--")def _test2():print("--test2--")def __test3():print("---test3--")
  • 使用 from somemodule import * 进行导入,不能导入私有变量,结果如下:
In [1]: from test import *In [2]: num
Out[2]: 10In [3]: _num
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-3-6dd7111d6a95> in <module>()
----> 1 _numNameError: name '_num' is not definedIn [4]: __num
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-4-f0ba2c4a214a> in <module>()
----> 1 __numNameError: name '__num' is not definedIn [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 definedIn [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 testIn [9]: test.num
Out[9]: 10In [10]: test._num
Out[10]: 20In [11]: test.__num
Out[11]: 30In [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 = 10def getNum(self):return self.__numdef setNum(self, value):self.__num = valuet = test()
print(t.getNum())   # 10
t.setNum(20)
print(t.getNum())   # 20

  2、property方法

class test(object):def __init__(self):self.__num = 10def getNum(self):return self.__numdef setNum(self, value):self.__num = valuenum = property(getNum,setNum)t = test()
print(t.num)   # 10
t.num = 20
print(t.num)   # 20

关于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@propertydef num(self):return self.__num@num.setterdef num(self, value):self.__num = valuet = test()
print(t.num)   # 10
t.num = 20
print(t.num)   # 20

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

根据文档可得:

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

我的Python学习笔记:私有变量相关推荐

  1. Python学习笔记之变量

    1.变量: 首先,新建一个文件为hello.py,添加一个变量并打印出来,具体代码如下: #python变量学习 sex='男' print(sex)sex="女" print(s ...

  2. 【Python学习笔记】第一章基础知识:格式化输出,转义字符,变量类型转换,算术运算符,运算符优先级和赋值运算符,逻辑运算符,世界杯案例题目,条件判断if语句,猜拳游戏与三目运算符

    Python学习笔记之[第一章]基础知识 前言: 一.格式化输出 1.基本格式: 2.练习代码: 二.转义字符 1.基本格式: 2.练习代码: 3.输出结果: 三.输入 1.基本格式: 2.练习代码: ...

  3. python 学习笔记 (核心)

    python    学习笔记 (核心) Python解释器从头到尾一行接一行执行脚本 # -*- coding: UTF-8 -*-    //字符编码 不区分单引号和双引号,x='hello',x[ ...

  4. Python学习笔记:第十三站 接着找对象

    Python学习笔记 文章目录 Python学习笔记 第十三站 接着找对象 1. 封装 2. 继承 3. 方法重写 4. object类 5. 多态 6. 特殊方法和特殊属性 7. 类的赋值与拷贝 8 ...

  5. python学习笔记,初学者Python3

    Python学习笔记 不推荐将python作为主力语言,但推荐作为一个辅助语言,用于日常的一些小的任务 python目前主要的应用场景: 1.机器学习,人工智能 2.爬虫 3.数据分析 4.自动化,运 ...

  6. 【Python学习笔记】下划线的含义

    [Python学习笔记]下划线的含义 1.单前导下划线_var 2. 单末尾下划线var_ 3. 双前导下划线__var 4. 双前导和末尾下划线__var__ 5. 单下划线_ 在Python中单下 ...

  7. Python学习笔记 (类与对象)

    Python学习笔记 (类与对象) 1.类与对象 面向对象编程语言类: 一个模板, (人类)-是一个抽象的, 没有实体的对象: (eg: 张三, 李四) 属性: (表示这类东西的特征, 眼睛, 嘴巴, ...

  8. python学习笔记(二) 基本运算

    python学习笔记(二) 基本运算 1. 条件运算 基本语法 if condition1: do somethings1elif condition2: do somethings2else: do ...

  9. Python学习笔记(一):从Hello,World开始到字符串

    Python学习笔记(一):从Hello,World开始到字符串 从Hello,World开始到字符串 Python学习笔记(一):从Hello,World开始到字符串 一. 关于print和注释 二 ...

  10. python学习笔记02

    python学习笔记02 面向对象Object Oriented 概述 类和对象 封装 继承 多态 类与类的关系 设计原则 总结 python学习笔记03 面向对象Object Oriented 概述 ...

最新文章

  1. Codeforces 458A Golden System
  2. Objective-C中.h、.m、.mm的区别
  3. JavaScript简明教程之快速入门
  4. StrickyAssignor 分配策略
  5. Android保存图片到本地相册
  6. 【Python】解决浮点数间运算存在不确定尾数的问题
  7. 问题 C: 能被3整除吗?
  8. Varnish的基本应用详解
  9. jQuery jqGrid 文档
  10. Python 编写几个经典例子
  11. 华为电脑如何投屏到电视linux,华为无线投屏怎么用
  12. 统计学三大相关性系数(pearson、spearman、kendall)的区别。
  13. 中国成品油价为啥会比美国贵30%?
  14. 【pycharm】复制粘贴快捷键失效
  15. Qt C++制作桌面天气,无边框、透明窗口,心知天气API,开放源码
  16. Andorid 安卓接入支付宝支付(当面付)
  17. syntactic sugar - 语法糖 - 糖衣语法
  18. VS Code中将自定义的Snippets绑定到自定义的快捷键上
  19. SAP ABAP 配置表开发常见问题总结与开发指南(SM30 SM34 SE54)
  20. Asp.net Core + EF Core + Bootstrap搭建的MVC后台通用管理系统模板(跨平台版本)

热门文章

  1. 2015计算机职称水平考试,2015计算机职称等级考试技巧汇总.doc
  2. C++设计模式之二(设计模式六大原则)
  3. 关于低代码技术方案调研
  4. 数学实验测试软件,matlab数学软件实验测试题.doc
  5. gopro7怎么回看视频_要案解读:IPTV限时回看不侵犯信息网络传播权
  6. [转]Emmet 生成 HTML 的语法
  7. surface pro频繁黑屏问题
  8. 对于拓扑空间的一些理解
  9. c语言程序设计mp4,[原创]Nisy编程教学视频C语言/C++语言MP4版
  10. 华通-小天 IDC