Python中私有属性的定义方式


Posted in Python onMarch 05, 2020

Python没有类似于Java的private关键字, 但也可以为类定义私有属性. 只需将属性命名变为以__开头, 例如 __field.

示例代码:

class Vector2D(object):
  def __init__(self, x, y):
    self.__x = float(x)
    self.__y = float(y)
    self.xx = x
    self.yy = y 
  def get_x(self):
    return self.__x # 内部访问
if __name__ == "__main__":
  v = Vector2D(3, 4)
  print v.__dict__
  print v._Vector2D__x, v.get_x()# 但是可以通过v._Vector2D__x 在外部访问
  v.__x # 外部访问

输出:

{'yy': 4, 'xx': 3, '_Vector2D__x': 3.0, '_Vector2D__y': 4.0}
3.0 3.0
Traceback (most recent call last):
...
v.__x
AttributeError: 'Vector2D' object has no attribute '__x'

从上面的例子可以看出:

1. __field被编译器重命名为_className__field

2. 在class外部不能访问obj.__field, 但在class内部可以

3. 但是, 这只能防止无意间的调用, 不能防止恶意调用, 用Fluent Python的话来讲, 这是一种safety device, not security device, 用国语来讲, 就是防君子不防xx, 因为可以通过obj._className__field在外部访问obj的私有__field.

补充知识:python中私有属性和私有方法,修改私有属性的值

如果一个属性是以两个下划线开始 就标识这个这个属性是一个私有属性

self.__money = 1000000

如果一个方法是以两个下划线开始 也代表已经私有

子类继承了父类 如果父类的属性私有 将不会被子类继承

私有属性和私有方法可以在类的里面使用

自定义类中 如果一个属性进行了私有 在类的外面不能调用

修改私有属性的值

如果需要修改一个对象的属性值,通常有2种方法

对象名.属性名 = 数据 ----> 直接修改

对象名.方法名() ----> 间接修改

私有属性不能直接访问,所以无法通过第一种方式修改,一般的通过第二种方式修改私有属性的值:定义一个可以调用的公有方法,在这个公有方法内访问修改。

class Person(object):
 
  def __init__(self):
    self.name = "小明"
    self.__age = 20
 
  #获取私有属性的值
  def get_age(self):
    return self.__age
 
  #设置私有属性的值
  def set_age(self, new_age):
    self.__age = new_age
 
 
#定义一个对象
p = Person()
#强行获取私有属性
#崇尚一切靠自觉
print(p._Person__age)
print(p.name)
#想在类的外面获取对象的属性
ret = p.get_age()
print(ret)
 
#想在类的外面修改对象私有属性的值
p.set_age(30)
print(p.get_age())

以上这篇Python中私有属性的定义方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python多重继承新算法C3介绍
Sep 28 Python
Python类的专用方法实例分析
Jan 09 Python
python图像处理之反色实现方法
May 30 Python
利用Python获取赶集网招聘信息前篇
Apr 18 Python
Python数据操作方法封装类实例
Jun 23 Python
django 2.0更新的10条注意事项总结
Jan 05 Python
python list元素为tuple时的排序方法
Apr 18 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
Aug 31 Python
对Python3中列表乘以某一个数的示例详解
Jul 20 Python
学python安装的软件总结
Oct 12 Python
pytorch中的上采样以及各种反操作,求逆操作详解
Jan 03 Python
Python sqlalchemy时间戳及密码管理实现代码详解
Aug 01 Python
Python实现AI自动抠图实例解析
Mar 05 #Python
python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例
Mar 05 #Python
Python matplotlib修改默认字体的操作
Mar 05 #Python
Django 返回json数据的实现示例
Mar 05 #Python
python利用opencv实现SIFT特征提取与匹配
Mar 05 #Python
python画图常规设置方式
Mar 05 #Python
解决python -m pip install --upgrade pip 升级不成功问题
Mar 05 #Python
You might like
桌面中心(三)修改数据库
2006/10/09 PHP
PHP图片裁剪函数(保持图像不变形)
2014/05/04 PHP
PHP操作FTP类 (上传、下载、移动、创建等)
2016/03/31 PHP
简单解决微信文章图片防盗链问题
2016/12/17 PHP
PHP中phar包的使用教程
2017/06/14 PHP
PHP延迟静态绑定使用方法实例解析
2020/09/05 PHP
JS 面向对象的5钟写法
2009/07/31 Javascript
javascript 导出数据到Excel(处理table中的元素)
2009/12/18 Javascript
jquery入门—编写一个导航条(可伸缩)
2013/01/07 Javascript
使用javascript获取页面名称
2014/12/23 Javascript
Javascript aop(面向切面编程)之around(环绕)分析
2015/05/01 Javascript
JavaScript实现表格点击排序的方法
2015/05/11 Javascript
jQuery插件开发精品教程(让你的jQuery更上一个台阶)
2015/11/07 Javascript
学习JavaScript设计模式之状态模式
2016/01/08 Javascript
JS+Canvas绘制时钟效果
2020/08/20 Javascript
jquery图片放大镜效果
2017/06/23 jQuery
vue+element-ui实现表格编辑的三种实现方式
2018/10/31 Javascript
Elasticsearch实现复合查询高亮结果功能
2019/09/10 Javascript
[01:31]DOTA2上海特级锦标赛 SECRET战队完整宣传片
2016/03/16 DOTA
[37:47]IG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python利用hook技术破解https的实例代码
2013/03/25 Python
Python使用SocketServer模块编写基本服务器程序的教程
2016/07/12 Python
Python编程实现使用线性回归预测数据
2017/12/07 Python
python OpenCV学习笔记实现二维直方图
2018/02/08 Python
python如何在循环引用中管理内存
2018/03/20 Python
python下PyGame的下载与安装过程及遇到问题
2019/08/04 Python
python统计指定目录内文件的代码行数
2019/09/19 Python
python针对Oracle常见查询操作实例分析
2020/04/30 Python
Python Opencv轮廓常用操作代码实例解析
2020/09/01 Python
聚美优品恶搞广告词
2014/03/14 职场文书
教师师德承诺书
2014/03/26 职场文书
土木工程求职信
2014/05/29 职场文书
财务管理专业求职信
2014/06/11 职场文书
教师个人培训总结
2015/02/11 职场文书
幼儿园教师求职信
2015/03/20 职场文书
OpenCV-Python 实现两张图片自动拼接成全景图
2021/06/11 Python