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服务器与android客户端socket通信实例
Nov 12 Python
python实现的简单文本类游戏实例
Apr 28 Python
python通过邮件服务器端口发送邮件的方法
Apr 30 Python
浅谈scrapy 的基本命令介绍
Jun 13 Python
Python基础练习之用户登录实现代码分享
Nov 08 Python
python爬虫的数据库连接问题【推荐】
Jun 25 Python
Django stark组件使用及原理详解
Aug 22 Python
Python多线程正确用法实例解析
May 30 Python
Python机器学习之PCA降维算法详解
May 19 Python
Pandas数据结构之Series的使用
Mar 31 Python
Python中itertools库的四个函数介绍
Apr 06 Python
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
Apr 14 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
全国FM电台频率大全 - 21 海南省
2020/03/11 无线电
PHP开发入门教程之面向对象
2006/12/05 PHP
PHP发明人谈MVC和网站设计架构 貌似他不支持php用mvc
2011/06/04 PHP
PHP错误提示的关闭方法详解
2013/06/23 PHP
Zend Framework页面缓存实例
2014/06/25 PHP
php正则修正符用法实例详解
2016/12/29 PHP
不错的一个日期输入 动态
2006/11/06 Javascript
传递参数的标准方法(jQuery.ajax)
2008/11/19 Javascript
IE6-IE9不支持table.innerHTML的解决方法分享
2012/09/14 Javascript
浅析document.createDocumentFragment()与js效率
2013/07/08 Javascript
JS实现漂亮的窗口拖拽效果(可改变大小、最大化、最小化、关闭)
2015/10/10 Javascript
如何防止JavaScript自动插入分号
2015/11/05 Javascript
jQuery插件实现带圆点的焦点图片轮播切换
2016/01/18 Javascript
JavaScript九九乘法口诀表的简单实现
2016/10/04 Javascript
浅谈vue单一组件下动态修改数据时的全部重渲染
2018/03/01 Javascript
webpack+vue-cil中proxyTable处理跨域的方法
2018/07/20 Javascript
Vue数据双向绑定的深入探究
2018/11/27 Javascript
微信小程序页面间传值与页面取值操作实例分析
2019/04/30 Javascript
javascript创建元素和删除元素实例小结
2019/06/19 Javascript
Bootstrap FileInput实现图片上传功能
2021/01/28 Javascript
理解python多线程(python多线程简明教程)
2014/06/09 Python
python的re模块应用实例
2014/09/26 Python
用Python实现换行符转换的脚本的教程
2015/04/16 Python
基于Python对象引用、可变性和垃圾回收详解
2017/08/21 Python
python3.6使用pickle序列化class的方法
2018/10/22 Python
django fernet fields字段加密实践详解
2019/08/12 Python
Python函数__new__及__init__作用及区别解析
2020/08/31 Python
Hotels.com中国区:好订网
2016/08/18 全球购物
数控技术专业推荐信
2013/11/01 职场文书
家长对孩子的感言
2014/03/10 职场文书
买卖协议书范本
2014/04/21 职场文书
个人委托书
2014/07/31 职场文书
森马旗舰店双十一营销方案
2014/09/29 职场文书
学校机关党总支领导班子整改工作方案
2014/10/26 职场文书
个人工作年终总结
2015/03/09 职场文书
毕业感言怎么写
2015/07/31 职场文书