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 相关文章推荐
Windows系统配置python脚本开机启动的3种方法分享
Mar 10 Python
python实现连接mongodb的方法
May 08 Python
Python2.x利用commands模块执行Linux shell命令
Mar 11 Python
python re模块的高级用法详解
Jun 06 Python
Python爬虫实现简单的爬取有道翻译功能示例
Jul 13 Python
Python Web编程之WSGI协议简介
Jul 18 Python
Python爬虫PyQuery库基本用法入门教程
Aug 04 Python
Python 实现自动导入缺失的库
Oct 29 Python
PyTorch中的padding(边缘填充)操作方式
Jan 03 Python
Python hashlib常见摘要算法详解
Jan 13 Python
python openCV自制绘画板
Oct 27 Python
Python如何批量生成和调用变量
Nov 21 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
mysq GBKl乱码
2006/11/28 PHP
php daddslashes()和 saddslashes()有哪些区别分析
2012/10/26 PHP
PHP分页类集锦
2014/11/18 PHP
PHP实现从上往下打印二叉树的方法
2018/01/18 PHP
laravel利用中间件做防非法登录和权限控制示例
2019/10/21 PHP
THREE.JS入门教程(6)创建自己的全景图实现步骤
2013/01/25 Javascript
js实现屏蔽默认快捷键调用自定义事件示例
2013/06/18 Javascript
Javascript基础教程之数组 array
2015/01/18 Javascript
解决node-webkit 不支持html5播放mp4视频的方法
2015/03/11 Javascript
jQuery获取URL请求参数的方法
2015/07/18 Javascript
javascript弹出拖动窗口
2015/08/11 Javascript
js调用百度地图及调用百度地图的搜索功能
2015/09/07 Javascript
JavaScript & jQuery完美判断图片是否加载完毕
2017/01/08 Javascript
React-router 4 按需加载的实现方式及原理详解
2017/05/25 Javascript
详解Nodejs之npm&package.json
2017/06/15 NodeJs
vue页面切换过渡transition效果
2018/10/08 Javascript
javascript定时器的简单应用示例【控制方块移动】
2019/06/17 Javascript
微信小程序动画组件使用解析,类似vue,且更强大
2019/08/01 Javascript
layer的prompt弹出框,点击回车,触发确定事件的方法
2019/09/06 Javascript
JS实现轮播图效果
2020/01/11 Javascript
JavaScript异步操作的几种常见处理方法实例总结
2020/05/11 Javascript
Python使用zip合并相邻列表项的方法示例
2018/03/17 Python
python寻找list中最大值、最小值并返回其所在位置的方法
2018/06/27 Python
Python 实现域名解析为ip的方法
2019/02/14 Python
浅谈python之高阶函数和匿名函数
2019/03/21 Python
django2笔记之路由path语法的实现
2019/07/17 Python
在TensorFlow中屏蔽warning的方式
2020/02/04 Python
HTML5 在canvas中绘制文本附效果图
2014/06/23 HTML / CSS
八一慰问活动方案
2014/02/07 职场文书
财务总经理岗位职责
2014/02/16 职场文书
大学生村官考核材料
2014/05/23 职场文书
大学学雷锋活动总结
2014/06/26 职场文书
财会专业大学生求职信
2014/09/26 职场文书
毕业生爱心捐书倡议书
2015/04/27 职场文书
植树节新闻稿
2015/07/17 职场文书
详解redis在微服务领域的贡献
2021/10/16 Redis