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开发之list操作实例分析
Feb 22 Python
Python列表推导式与生成器表达式用法示例
Feb 08 Python
python如何为被装饰的函数保留元数据
Mar 21 Python
python验证码识别教程之灰度处理、二值化、降噪与tesserocr识别
Jun 04 Python
python对日志进行处理的实例代码
Oct 06 Python
python添加菜单图文讲解
Jun 04 Python
Python+OpenCV+pyQt5录制双目摄像头视频的实例
Jun 28 Python
python实现简单聊天室功能 可以私聊
Jul 12 Python
PYTHON如何读取和写入EXCEL里面的数据
Oct 28 Python
jupyter notebook 调用环境中的Keras或者pytorch教程
Apr 14 Python
keras自动编码器实现系列之卷积自动编码器操作
Jul 03 Python
python 模块重载的五种方法
Apr 24 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
用PHP+MySql编写聊天室
2006/10/09 PHP
PHP技术开发技巧分享
2010/03/23 PHP
基于MySQL到MongoDB简易对照表的详解
2013/06/03 PHP
javascript的内存管理详解
2013/08/07 Javascript
JavaScript 中的日期和时间及表示标准介绍
2013/08/21 Javascript
深入解读JavaScript中的Iterator和for-of循环
2015/07/28 Javascript
jquery模拟alert的弹窗插件
2015/07/31 Javascript
JS创建事件的三种方法(实例代码)
2016/05/12 Javascript
js实现文字跑马灯效果
2017/02/23 Javascript
微信小程序商城项目之侧栏分类效果(1)
2017/04/17 Javascript
VUE利用vuex模拟实现新闻点赞功能实例
2017/06/28 Javascript
使用vue-cli打包过程中的步骤以及问题的解决
2018/05/08 Javascript
js隐式转换的知识实例讲解
2018/09/28 Javascript
JS实现的自定义map方法示例
2019/05/17 Javascript
使用vue自定义指令开发表单验证插件validate.js
2019/05/23 Javascript
JavaScript 几种循环方式以及模块化的总结
2020/09/03 Javascript
python中的一些类型转换函数小结
2013/02/10 Python
Python实现一个转存纯真IP数据库的脚本分享
2017/05/21 Python
python中字符串的操作方法大全
2018/06/03 Python
Python continue继续循环用法总结
2018/06/10 Python
Python简单处理坐标排序问题示例
2019/07/11 Python
Pandas之groupby( )用法笔记小结
2019/07/23 Python
如何安装2019Pycharm最新版本(详细教程)
2019/09/26 Python
Python 中使用 PyMySQL模块操作数据库的方法
2019/11/10 Python
pytorch的梯度计算以及backward方法详解
2020/01/10 Python
Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
2020/02/12 Python
通过canvas转换颜色为RGBA格式及性能问题的解决
2019/11/22 HTML / CSS
美国电子元器件分销商:Newark element14
2018/01/13 全球购物
Giglio英国站:意大利奢侈品购物网
2018/03/06 全球购物
捷克移动配件网上商店:ProMobily.cz
2019/03/15 全球购物
美国高端牛仔品牌:Silver Jeans
2019/12/12 全球购物
UNIX文件名称有什么规定
2013/03/25 面试题
计算机专业毕业生的自我评价
2013/11/18 职场文书
2014财务年终工作总结
2014/12/08 职场文书
详解Python flask的前后端交互
2022/03/31 Python
Golang 实现 WebSockets 之创建 WebSockets
2022/04/24 Golang