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中定义和使用抽象类的方法
Jun 30 Python
浅谈Python类里的__init__方法函数,Python类的构造函数
Dec 10 Python
Python绘制3d螺旋曲线图实例代码
Dec 20 Python
使用python将时间转换为指定的格式方法
Nov 12 Python
python实现汽车管理系统
Nov 30 Python
Python可变参数会自动填充前面的默认同名参数实例
Nov 18 Python
pandas的相关系数与协方差实例
Dec 27 Python
在spyder IPython console中,运行代码加入参数的实例
Apr 20 Python
Python3 requests模块如何模仿浏览器及代理
Jun 15 Python
python用Configobj模块读取配置文件
Sep 26 Python
Python colormap库的安装和使用详情
Oct 06 Python
Python中Pyspider爬虫框架的基本使用详解
Jan 27 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 裁剪图片成固定大小代码方法
2009/09/09 PHP
php设计模式 Delegation(委托模式)
2011/06/26 PHP
php输入流php://input使用浅析
2014/09/02 PHP
php去除html标记的原生函数详解
2015/01/27 PHP
php通过文件头判断格式的方法
2016/05/28 PHP
PHP的mysqli_thread_id()函数讲解
2019/01/24 PHP
javascript hashtable实现代码
2009/10/13 Javascript
JavaScript 图像动画的小demo
2012/05/23 Javascript
jQuery中has()方法用法实例
2015/01/06 Javascript
JavaScript常用脚本汇总(三)
2015/03/04 Javascript
详解AngularJS如何实现跨域请求
2016/08/22 Javascript
炫酷的js手风琴效果
2016/10/13 Javascript
js设置和获取自定义属性的方法
2016/10/20 Javascript
jquery 追加元素append、prepend、before、after用法与区别分析
2016/12/02 Javascript
微信小程序和百度的语音识别接口详解
2019/05/06 Javascript
Vue2.X和Vue3.0数据响应原理变化的区别
2019/11/07 Javascript
js验证账户名是否重复
2020/05/26 Javascript
探究一道价值25k的蚂蚁金服异步串行面试题
2020/08/21 Javascript
详解vite2.0配置学习(typescript版本)
2021/02/25 Javascript
Python-基础-入门 简介
2014/08/09 Python
python统计字符串中指定字符出现次数的方法
2015/04/04 Python
Python外星人入侵游戏编程完整版
2020/03/30 Python
python脚本爬取字体文件的实现方法
2017/04/29 Python
Python实现按特定格式对文件进行读写的方法示例
2017/11/30 Python
python取代netcat过程分析
2018/02/10 Python
Django代码性能优化与Pycharm Profile使用详解
2018/08/26 Python
python pip源配置,pip配置文件存放位置的方法
2019/07/12 Python
Selenium基于PIL实现拼接滚动截图
2020/04/10 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
2020/10/18 Python
爱尔兰电子产品购物网站:Komplett.ie
2018/04/04 全球购物
电气技术员岗位职责
2013/11/19 职场文书
工程项目经理任命书
2014/06/05 职场文书
测绘工程专业求职信
2014/07/15 职场文书
新年晚会主持词开场白
2015/05/28 职场文书
简单且有用的Python数据分析和机器学习代码
2021/07/02 Python
MySQL示例讲解数据库约束以及表的设计
2022/06/16 MySQL