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+Turtle动态绘制一棵树实例分享
Jan 16 Python
学习python中matplotlib绘图设置坐标轴刻度、文本
Feb 07 Python
Python中常见的异常总结
Feb 20 Python
python分数表示方式和写法
Jun 26 Python
Python Django 页面上展示固定的页码数实现代码
Aug 21 Python
python hash每次调用结果不同的原因
Nov 21 Python
Python hmac模块使用实例解析
Dec 24 Python
pycharm下配置pyqt5的教程(anaconda虚拟环境下+tensorflow)
Mar 25 Python
基于python计算并显示日间、星期客流高峰
May 07 Python
如何用python爬取微博热搜数据并保存
Feb 20 Python
拒绝盗图!教你怎么用python给图片加水印
Jun 04 Python
利用Python实时获取steam特惠游戏数据
Jun 25 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
给apache2.2加上mod_encoding模块後 php5.2.0 处理url出现bug
2007/04/12 PHP
php目录管理函数小结
2008/09/10 PHP
ThinkPHP写第一个模块应用
2012/02/20 PHP
Yii操作数据库的3种方法
2014/03/11 PHP
php返回相对时间(如:20分钟前,3天前)的方法
2015/04/14 PHP
浅谈PHP面向对象之访问者模式+组合模式
2017/05/22 PHP
xmlHTTP实例
2006/10/24 Javascript
Google韩国首页图标动画效果
2007/08/26 Javascript
JS保留两位小数 四舍五入函数的小例子
2013/11/20 Javascript
eclipse导入jquery包后报错的解决方法
2014/02/17 Javascript
jQuery中Ajax的load方法详解
2015/01/14 Javascript
JavaScript获取数组最小值和最大值的方法
2015/06/09 Javascript
分步解析JavaScript实现tab选项卡自动切换功能
2016/01/25 Javascript
jQuery 插件实现随机自由弹跳气泡样式
2017/01/12 Javascript
解决vue 项目引入字体图标报错、不显示等问题
2018/09/01 Javascript
vue实现循环切换动画
2018/10/17 Javascript
微信小程序图表插件wx-charts用法实例详解
2019/05/20 Javascript
JS实现给数组对象排序的方法分析
2019/06/24 Javascript
js调用网络摄像头的方法
2020/12/05 Javascript
Sanic框架请求与响应实例分析
2018/07/16 Python
pandas.DataFrame删除/选取含有特定数值的行或列实例
2018/11/07 Python
Python多进程入门、分布式进程数据共享实例详解
2019/06/03 Python
matplotlib.pyplot画图并导出保存的实例
2019/12/07 Python
Python实现一个简单的毕业生信息管理系统的示例代码
2020/06/08 Python
python中绕过反爬虫的方法总结
2020/11/25 Python
使用CSS3创建动态菜单效果
2015/07/10 HTML / CSS
Html5游戏开发之乒乓Ping Pong游戏示例(一)
2013/01/21 HTML / CSS
数控技术应届生求职信
2013/11/13 职场文书
军训考核自我鉴定
2014/02/13 职场文书
《小池塘》教学反思
2014/02/28 职场文书
2015年教师节活动总结
2015/03/20 职场文书
2015年计生协会工作总结
2015/04/24 职场文书
关于调整工作时间的通知
2015/04/24 职场文书
老生常谈 使用 CSS 实现三角形的技巧(多种方法)
2021/04/13 HTML / CSS
原生JS实现飞机大战小游戏
2021/06/09 Javascript
Spring Cloud Netflix 套件中的负载均衡组件 Ribbon
2022/04/13 Java/Android