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使用socket远程连接错误处理方法
Apr 29 Python
深入解析Python中的__builtins__内建对象
Jun 21 Python
Python 中开发pattern的string模板(template) 实例详解
Apr 01 Python
Python多线程编程之多线程加锁操作示例
Sep 06 Python
python3 中文乱码与默认编码格式设定方法
Oct 31 Python
python matplotlib库绘制条形图练习题
Aug 10 Python
python求加权平均值的实例(附纯python写法)
Aug 22 Python
使用pyqt5 tablewidget 单元格设置正则表达式
Dec 13 Python
Python稀疏矩阵及参数保存代码实现
Apr 18 Python
Python填充任意颜色,不同算法时间差异分析说明
May 16 Python
基于pycharm 项目和项目文件命名规则的介绍
Jan 15 Python
Python面向对象编程之类的概念
Nov 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
ueditor 1.2.6 使用方法说明
2013/07/24 PHP
div当滚动到页面顶部的时候固定在顶部实例代码
2013/05/27 Javascript
jQuery中delegate与on的用法与区别示例介绍
2013/12/20 Javascript
jquery中子元素和后代元素的区别示例介绍
2014/04/02 Javascript
jQuery中size()方法用法实例
2014/12/27 Javascript
基于jQuery实现Div窗口震动特效代码-代码简单
2015/08/28 Javascript
学习JavaScript设计模式(代理模式)
2015/12/03 Javascript
浅谈JavaScript函数的四种存在形态
2016/06/08 Javascript
jQuery实现ToolTip元素定位显示功能示例
2016/11/23 Javascript
纯js三维数组实现三级联动效果
2017/02/07 Javascript
jquery dialog获取焦点的方法
2017/02/09 Javascript
jQuery弹出窗口简单实现代码
2017/03/09 Javascript
jQuery实现文章图片弹出放大效果
2017/04/06 jQuery
xmlplus组件设计系列之按钮(2)
2017/04/26 Javascript
Vue2几种常见开局方式详解
2017/09/09 Javascript
vue.js移动数组位置,同时更新视图的方法
2018/03/08 Javascript
Vue表单输入绑定的示例代码
2018/11/01 Javascript
vue-router结合vuex实现用户权限控制功能
2019/11/14 Javascript
使用Node.js实现base64和png文件相互转换的方法
2020/03/11 Javascript
Python 查看文件的编码格式方法
2017/12/21 Python
Django ManyToManyField 跨越中间表查询的方法
2018/12/18 Python
python实现维吉尼亚算法
2019/03/20 Python
python 判断txt每行内容中是否包含子串并重新写入保存的实例
2020/03/12 Python
Python如何解除一个装饰器
2020/08/07 Python
推荐值得学习的12款python-web开发框架
2020/08/10 Python
python 第三方库paramiko的常用方式
2021/02/20 Python
GIVENCHY纪梵希官方旗舰店:高定彩妆与贵族护肤品
2018/04/16 全球购物
文员个人的求职信范文
2013/09/26 职场文书
自动化专业个人求职信范文
2013/12/30 职场文书
优秀党员获奖感言
2014/02/18 职场文书
有创意的广告词
2014/03/18 职场文书
《望庐山瀑布》教学反思
2014/04/22 职场文书
让世界充满爱演讲稿
2014/05/24 职场文书
党支部党的群众路线对照检查材料
2014/09/24 职场文书
2014年预备党员群众路线教育实践活动对照检查材料思想汇报
2014/10/02 职场文书
2016年小学党支部创先争优活动总结
2016/04/05 职场文书