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应用程序在windows下不出现cmd窗口的办法
May 29 Python
Python urlopen()函数 示例分享
Jun 12 Python
使用Python中的线程进行网络编程的入门教程
Apr 15 Python
python使用arp欺骗伪造网关的方法
Apr 24 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
Jul 31 Python
使用python画社交网络图实例代码
Jul 10 Python
django 使用全局搜索功能的实例详解
Jul 18 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
Mar 06 Python
python求解汉诺塔游戏
Jul 09 Python
Python selenium键盘鼠标事件实现过程详解
Jul 28 Python
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
Apr 12 Python
Python基础详解之描述符
Apr 28 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
我的群发邮件程序
2006/10/09 PHP
那些年一起学习的PHP(三)
2012/03/22 PHP
javascript 关于# 和 void的区别分析
2009/10/26 Javascript
解析javascript 实用函数的使用详解
2013/05/10 Javascript
ie中js创建checkbox默认选中问题探讨
2013/10/21 Javascript
ExtJS 刷新后如何默认选中刷新前最后一次选中的节点
2014/04/03 Javascript
jquery图片切换插件
2015/03/16 Javascript
jQuery实现图片渐入渐出切换展示效果
2015/08/15 Javascript
javascript编程异常处理实例小结
2015/11/30 Javascript
用js实现放大镜的效果的简单实例
2016/05/23 Javascript
vue环境搭建简单教程
2017/11/07 Javascript
如何通过setTimeout理解JS运行机制详解
2019/03/23 Javascript
layui的表单验证支持ajax判断用户名是否重复的实例
2019/09/06 Javascript
python中关于时间和日期函数的常用计算总结(time和datatime)
2013/03/08 Python
c++生成dll使用python调用dll的方法
2014/01/20 Python
python使用socket进行简单网络连接的方法
2015/04/29 Python
Python中关于使用模块的基础知识
2015/05/24 Python
玩转python爬虫之爬取糗事百科段子
2016/02/17 Python
python实现中文转换url编码的方法
2016/06/14 Python
Python自动化运维和部署项目工具Fabric使用实例
2016/09/18 Python
python pandas 如何替换某列的一个值
2018/06/09 Python
使用Python做定时任务及时了解互联网动态
2019/05/15 Python
Django中多种重定向方法使用详解
2019/07/17 Python
Pycharm中Python环境配置常见问题解析
2020/01/16 Python
tensorflow dataset.shuffle、dataset.batch、dataset.repeat顺序区别详解
2020/06/03 Python
Python实现列表索引批量删除的5种方法
2020/11/16 Python
Python3.9.0 a1安装pygame出错解决全过程(小结)
2021/02/02 Python
用html5实现语音搜索框的方法
2014/03/18 HTML / CSS
美国美食礼品篮网站:Gourmet Gift Baskets
2019/12/15 全球购物
卡拉威高尔夫官方网站:Callaway Golf
2020/09/16 全球购物
信用社员工先进事迹材料
2014/02/04 职场文书
《满井游记》教学反思
2014/02/26 职场文书
《白鹅》教学反思
2014/04/13 职场文书
学校节能减排方案
2014/06/13 职场文书
SpringAop日志找不到方法的处理
2021/06/21 Java/Android
python中使用redis用法详解
2022/12/24 Redis