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实现自动添加脚本头信息的示例代码
Sep 02 Python
json跨域调用python的方法详解
Jan 11 Python
Python Unittest自动化单元测试框架详解
Apr 04 Python
Django 日志配置按日期滚动的方法
Jan 31 Python
浅析Python语言自带的数据结构有哪些
Aug 27 Python
Python解析json代码实例解析
Nov 25 Python
如何给Python代码进行加密
Jan 10 Python
Python如何使用bokeh包和geojson数据绘制地图
Mar 21 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
Mar 26 Python
python 操作mysql数据中fetchone()和fetchall()方式
May 15 Python
Python实现上下文管理器的方法
Aug 07 Python
Python Numpy之linspace用法说明
Apr 17 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
DOTA2游戏同人动画《龙之血》导演接受采访
2021/03/05 欧美动漫
简单示例AJAX结合PHP代码实现登录效果代码
2008/07/25 PHP
关于Iframe如何跨域访问Cookie和Session的解决方法
2013/04/15 PHP
使用PHP和HTML5 FormData实现无刷新文件上传教程
2014/09/06 PHP
PHP随机生成信用卡卡号的方法
2015/03/23 PHP
php投票系统之增加与删除投票(管理员篇)
2016/07/01 PHP
CI框架无限级分类+递归的实现代码
2016/11/01 PHP
动态加载iframe时get请求传递中文参数乱码解决方法
2014/05/07 Javascript
jquery中$each()方法的使用指南
2015/04/30 Javascript
JavaScript简单修改窗口大小的方法
2015/08/03 Javascript
javascript实现密码验证
2015/11/10 Javascript
关于webpack代码拆分的解析
2017/07/20 Javascript
Vue 中批量下载文件并打包的示例代码
2017/11/20 Javascript
web前端vue之vuex单独一文件使用方式实例详解
2018/01/11 Javascript
vue中添加mp3音频文件的方法
2018/03/02 Javascript
详解Vue2 添加对scss的支持
2019/01/02 Javascript
5个你不知道的JavaScript字符串处理库(小结)
2020/06/01 Javascript
解决vue 给window添加和移除resize事件遇到的坑
2020/07/21 Javascript
python定时器(Timer)用法简单实例
2015/06/04 Python
利用numpy+matplotlib绘图的基本操作教程
2017/05/03 Python
Pandas 对Dataframe结构排序的实现方法
2018/04/10 Python
python3+PyQt5实现柱状图
2018/04/24 Python
Linux下多个Python版本安装教程
2018/08/15 Python
Python使用指定端口进行http请求的例子
2019/07/25 Python
opencv 获取rtsp流媒体视频的实现方法
2019/08/23 Python
基于python实现坦克大战游戏
2020/10/27 Python
python 制作网站小说下载器
2021/02/20 Python
Html5新增标签与样式及让元素水平垂直居中
2019/07/11 HTML / CSS
Html5基于canvas实现电子签名并生成PDF文档
2020/12/07 HTML / CSS
红色康乃馨酒店:Red Carnation Hotels
2017/06/22 全球购物
泰国办公用品购物网站:OfficeMate
2018/02/04 全球购物
2014年文明创建工作总结
2014/11/25 职场文书
毕业生评语大全
2015/01/04 职场文书
2015年教师节演讲稿范文
2015/03/19 职场文书
学历证明范文
2015/06/16 职场文书
Java中常用解析工具jackson及fastjson的使用
2021/06/28 Java/Android