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装饰器
Jul 27 Python
Python入门_浅谈数据结构的4种基本类型
May 16 Python
Python调用C语言的方法【基于ctypes模块】
Jan 22 Python
python 美化输出信息的实例
Oct 15 Python
python list格式数据excel导出方法
Oct 31 Python
详解Python安装tesserocr遇到的各种问题及解决办法
Mar 07 Python
Python实现的排列组合、破解密码算法示例
Apr 12 Python
python读写csv文件实例代码
Jul 05 Python
使用 Python 写一个简易的抽奖程序
Dec 08 Python
利用matplotlib实现根据实时数据动态更新图形
Dec 13 Python
Pandas实现DataFrame按行求百分数(比例数)
Dec 27 Python
OpenCV+Python3.5 简易手势识别的实现
Dec 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
安健A254立体声随身听的分析与打磨
2021/03/02 无线电
php empty() 检查一个变量是否为空
2011/11/10 PHP
Laravel框架实现文件上传的方法分析
2019/09/29 PHP
最佳6款用于移动网站开发的jQuery 图片滑块插件小结
2012/07/20 Javascript
jQuery toggle 代替方法
2016/03/22 Javascript
js正则表达式最长匹配(贪婪匹配)和最短匹配(懒惰匹配)用法分析
2016/12/27 Javascript
分享bootstrap学习笔记心得(组件及其属性)
2017/01/11 Javascript
在页面中引入js的两种方法(推荐)
2017/08/29 Javascript
基于Vue开发数字输入框组件
2017/12/19 Javascript
@angular前端项目代码优化之构建Api Tree的方法
2018/12/24 Javascript
Nodejs实现的操作MongoDB数据库功能完整示例
2019/02/02 NodeJs
jquery操作select常见方法大全【7种情况】
2019/05/28 jQuery
JavaScript对象原型链原理详解
2020/02/05 Javascript
Element Popover 弹出框的使用示例
2020/07/26 Javascript
速记Python布尔值
2017/11/09 Python
Python脚本按照当前日期创建多级目录
2019/03/01 Python
python opencv 简单阈值算法的实现
2019/08/04 Python
使用 Supervisor 监控 Python3 进程方式
2019/12/05 Python
python网络编程:socketserver的基本使用方法实例分析
2020/04/09 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
2020/04/22 Python
Python flask框架实现浏览器点击自定义跳转页面
2020/06/04 Python
巧用CSS3 border实现图片遮罩效果代码
2012/04/09 HTML / CSS
宝拉珍选美国官网:Paula’s Choice美国
2018/01/07 全球购物
初级软件工程师面试题 Junior Software Engineer Interview
2015/02/15 面试题
家居饰品店创业计划书
2014/01/31 职场文书
元旦寄语大全
2014/04/10 职场文书
卫生系统先进事迹
2014/05/13 职场文书
学生吸烟检讨书
2014/09/14 职场文书
公务员考察材料
2014/12/23 职场文书
英语读书笔记
2015/07/02 职场文书
军训通讯稿范文
2015/07/18 职场文书
新郎结婚感言
2015/07/31 职场文书
员工安全责任协议书
2016/03/22 职场文书
Nginx已编译的nginx-添加新模块
2021/04/01 Servers
MySQL 8.0 Online DDL快速加列的相关总结
2021/06/02 MySQL
vue+echarts实现多条折线图
2022/03/21 Vue.js