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实现Const详解
Jan 27 Python
深入解析Python中的__builtins__内建对象
Jun 21 Python
解决Python的str强转int时遇到的问题
Apr 09 Python
python pandas.DataFrame选取、修改数据最好用.loc,.iloc,.ix实现
Jun 11 Python
使用python3实现操作串口详解
Jan 01 Python
Python基于mysql实现学生管理系统
Feb 21 Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
Jul 22 Python
使用NumPy读取MNIST数据的实现代码示例
Nov 20 Python
python+selenium定时爬取丁香园的新型冠状病毒数据并制作出类似的地图(部署到云服务器)
Feb 09 Python
详解Python为什么不用设计模式
Jun 24 Python
一文搞懂python异常处理、模块与包
Jun 26 Python
Python Matplotlib绘制两个Y轴图像
Apr 13 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
值得分享的php+ajax实时聊天室
2016/07/20 PHP
详解PHP中foreach的用法和实例
2016/10/25 PHP
PHP 文件锁与进程锁的使用示例
2017/08/07 PHP
javascript中的作用域和上下文使用简要概述
2013/12/05 Javascript
Asp.Net之JS生成分页条的方法
2016/11/23 Javascript
基于jQuery实现左侧菜单栏可折叠功能
2016/12/27 Javascript
javascript 单例模式详解及简单实例
2017/02/14 Javascript
使用JS 插件qrcode.js生成二维码功能
2017/02/20 Javascript
Node.js连接mongodb实例代码
2017/06/06 Javascript
JavaScript之filter_动力节点Java学院整理
2017/06/28 Javascript
vue嵌套路由与404重定向实现方法分析
2018/05/04 Javascript
Cocos2d实现刮刮卡效果
2018/12/20 Javascript
vue.js循环radio的实例
2019/11/07 Javascript
微信小程序实现组件顶端固定或底端固定效果(不随滚动而滚动)
2020/04/09 Javascript
vue抽出组件并传值实例
2020/07/31 Javascript
vue移动端写的拖拽功能示例代码
2020/09/09 Javascript
[01:06:26]全国守擂赛第二周 Team Coach vs DeMonsTer
2020/04/28 DOTA
本地文件上传到七牛云服务器示例(七牛云存储)
2014/01/11 Python
详细解读Python中解析XML数据的方法
2015/10/15 Python
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
2015/10/18 Python
Python 多线程不加锁分块读取文件的方法
2018/12/11 Python
Python中url标签使用知识点总结
2020/01/16 Python
Python 统计位数为偶数的数字代码详解
2020/03/15 Python
咖啡为什么会有酸味?你喝到的咖啡為什麼是酸的?
2021/03/17 冲泡冲煮
Omio英国:搜索并比较便宜的巴士、火车和飞机
2019/08/27 全球购物
GafasWorld西班牙:购买太阳镜、眼镜和隐形眼镜
2019/09/08 全球购物
商务助理岗位职责
2013/11/13 职场文书
人力资源管理专业学生自我评价
2013/11/20 职场文书
遗嘱公证书标准样本
2014/04/08 职场文书
2014年加油站站长工作总结
2014/12/23 职场文书
个人委托书范文
2015/01/28 职场文书
高考学习决心书
2015/02/04 职场文书
二审答辩状格式
2015/05/22 职场文书
我是特种兵观后感
2015/06/11 职场文书
高中数学教学反思范文
2016/02/18 职场文书
Redis基本数据类型哈希Hash常用操作命令
2022/06/01 Redis