python调用私有属性的方法总结


Posted in Python onJuly 24, 2020

当我们定义一个类的时候,有时候会定义一个私有属性来辅助开发。在其它语言中经常会用到 private 来修饰这个属性为私有属性。可是你知道么?同样为私有属性,有的开发语言中是真私有属性,有的是假私有属性。

例如 :在 OC 开发过程中出现的私有属性就是假私有属性,通过 runtime 可以很方便拿到私有属性并进行修改。同出师门,swift 中的私有属性就是真私有属性,通常需要 private 来修饰。

那么在 python 开发中,我们如何来定义一个私有属性呢?作为约定俗成,我们通常在属性的前面加两个下划线,即__age就代表是一个私有属性。

也许你会有疑问,这个属性是真私有属性还是假私有属性?

首先我们定义一个类,并在该类中初始化两个属性,其中一个为私有属性。如下所示:

class Person(object):
# 构造函数
def __init__(self, name):
    self.name = name
    self.__age = 18

创建一个对象,并给初始化name 属性。

obj = Person("lily")
print(obj.name)

运行该模块就会打印出:lily

那么私有属性该如何访问:

print(obj.__age)

运行模块之后,控制台会打印出:

'Person' object has no attribute '__age'

既然 age作为私有属性,所以该属性就不能直接访问。

正确调用方法为:

print(obj._Person__age)

控制台就可以打印出:18

同样,可以重新给私有属性赋值

obj._Person__age = 20

print(obj._Person__age)

控制台就可以打印出:20

如果我们另外创建一个类并继承 Person,该如何访问自己的私有属性并做修改呢?

class Student(Person):
    def __init__(self):
        self.__gender = 'male'
        stu = Student()
        print(stu._Student__gender)

控制台会打印出来:male

如果访问父类的私有属性呢?

print(stu._Person__age)

这个时候,控制台会打印:'Student' object has no attribute '_Person__age'

这进一步证明了,私有属性是无法被继承的。

由此可知,在 Python 中私有属性为假私有属性。那为什么不从语法上保证 private 字段的私密性呢?用最简单的一句话来说:We are all consenting adults here。正如Python 程序员的观点:开放要比封闭好。

综上所述:

Python 编译器无法严格保证 private 字段的私密性。

只有当子类不受自己控制的时候,才可以考虑使用 private 属性来避免名称冲突。

实例扩展:

#! encoding=UTF-8
 
class A:
  def __init__(self):
    
    # 定义私有属性
    self.__name = "wangwu"
    
    # 普通属性定义
    self.age = 19
    
a = A()
 
# 正常输出
print a.age
 
# 提示找不到属性
print a.__name

执行输出:

Traceback (most recent call last):
File "C:\Users\lee\Documents\Aptana Studio 3 Workspace\testa\a.py", line 19, in <module>
print a.__name
AttributeError: A instance has no attribute '__name'

到此这篇关于python调用私有属性的方法总结的文章就介绍到这了,更多相关python怎么调用私有属性内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
在Python中使用dict和set方法的教程
Apr 27 Python
python使用append合并两个数组的方法
Apr 28 Python
Python heapq使用详解及实例代码
Jan 25 Python
python实现决策树、随机森林的简单原理
Mar 26 Python
python实现随机调用一个浏览器打开网页
Apr 21 Python
python实现多进程代码示例
Oct 31 Python
对pandas的层次索引与取值的新方法详解
Nov 06 Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
Jul 03 Python
Pycharm+Python+PyQt5使用详解
Sep 25 Python
树莓派4B+opencv4+python 打开摄像头的实现方法
Oct 18 Python
TensorFlow实现保存训练模型为pd文件并恢复
Feb 06 Python
python字典的元素访问实例详解
Jul 21 Python
python中取绝对值简单方法总结
Jul 24 #Python
python代码能做成软件吗
Jul 24 #Python
深入了解Python 变量作用域
Jul 24 #Python
详解Python IO编程
Jul 24 #Python
Python如何实现大型数组运算(使用NumPy)
Jul 24 #Python
基于opencv的selenium滑动验证码的实现
Jul 24 #Python
详解python中GPU版本的opencv常用方法介绍
Jul 24 #Python
You might like
计算2000年01月01日起到指定日的天数
2006/10/09 PHP
PHP中一个控制字符串输出的函数
2006/10/09 PHP
php根据isbn书号查询amazon网站上的图书信息的示例
2014/02/13 PHP
PHP中实现获取IP和地理位置类分享
2015/02/10 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
JQuery 无废话系列教程(二) jquery实战篇上
2009/06/23 Javascript
jQuery)扩展jQuery系列之一 模拟alert,confirm(一)
2010/12/04 Javascript
探寻Javascript执行效率问题
2014/11/12 Javascript
详谈JavaScript内存泄漏
2014/11/14 Javascript
做web开发 先学JavaScript
2014/12/12 Javascript
浅谈jquery事件处理
2015/04/24 Javascript
分享经典的JavaScript开发技巧
2015/11/21 Javascript
浅析jQuery 遍历函数,javascript中的each遍历
2016/05/25 Javascript
vue2.0中vue-cli实现全选、单选计算总价格的实例代码
2017/07/18 Javascript
elementUI中Table表格问题的解决方法
2018/12/04 Javascript
js实现数据导出为EXCEL(支持大量数据导出)
2020/03/31 Javascript
国内常用的js类库大全(CDN公共库)
2020/06/24 Javascript
python使用json序列化datetime类型实例解析
2018/02/11 Python
Python3.5 处理文本txt,删除不需要的行方法
2018/12/10 Python
celery4+django2定时任务的实现代码
2018/12/23 Python
Django unittest 设置跳过某些case的方法
2018/12/26 Python
Python实现计算字符串中出现次数最多的字符示例
2019/01/21 Python
详解python中TCP协议中的粘包问题
2019/03/22 Python
pyqt5 实现 下拉菜单 + 打开文件的示例代码
2019/06/20 Python
Django Rest framework解析器和渲染器详解
2019/07/25 Python
基于Keras的格式化输出Loss实现方式
2020/06/17 Python
pycharm中选中一个单词替换所有重复单词的实现方法
2020/11/17 Python
使用sublime text3搭建Python编辑环境的实现
2021/01/12 Python
程序员机试试题汇总
2012/03/07 面试题
应用艺术专业个人的自我评价
2014/01/03 职场文书
结婚喜宴主持词
2014/03/14 职场文书
运动会口号8字
2014/06/07 职场文书
加强作风建设演讲稿
2014/10/24 职场文书
先进工作者推荐材料
2014/12/23 职场文书
商场营业员岗位职责
2015/04/14 职场文书
react中的DOM操作实现
2021/06/30 Javascript