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创建和删除目录的方法
Apr 29 Python
python使用urllib2提交http post请求的方法
May 26 Python
Python Sql数据库增删改查操作简单封装
Apr 18 Python
Python实现多线程的两种方式分析
Aug 29 Python
python linecache 处理固定格式文本数据的方法
Jan 08 Python
在Pycharm中将pyinstaller加入External Tools的方法
Jan 16 Python
Python3.4学习笔记之类型判断,异常处理,终止程序操作小结
Mar 01 Python
Python3.5基础之变量、数据结构、条件和循环语句、break与continue语句实例详解
Apr 26 Python
关于多元线性回归分析——Python&SPSS
Feb 24 Python
解决Python Matplotlib绘图数据点位置错乱问题
May 16 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
Jun 30 Python
Django-simple-captcha验证码包使用方法详解
Nov 28 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文件操作之小型留言本实例
2015/06/20 PHP
Yii2框架实现利用mpdf创建pdf文件功能示例
2019/02/08 PHP
jQuery EasyUI 中文API Layout(Tabs)
2010/04/27 Javascript
javascript 获取所有id中包含某关键字的控件的实现代码
2010/11/25 Javascript
初识JQuery 实例一(first)
2011/03/16 Javascript
图片在浏览器中底部对齐 解决方法之一
2011/11/30 Javascript
JS格式化数字保留两位小数点示例代码
2013/10/15 Javascript
javascript数组操作(创建、元素删除、数组的拷贝)
2014/04/07 Javascript
在css加载完毕后自动判断页面是否加入css或js文件
2014/09/10 Javascript
jQuery中remove()方法用法实例
2014/12/25 Javascript
不想让浏览器运行javascript脚本的方法
2015/11/20 Javascript
javascript鼠标滑过显示二级菜单特效
2020/11/18 Javascript
vue.js入门教程之绑定class和style样式
2016/09/02 Javascript
常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全(推荐)
2016/12/20 Javascript
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
2017/01/04 Javascript
js仿QQ邮箱收件人选择与搜索功能
2017/02/10 Javascript
Angular2入门--架构总览
2017/03/29 Javascript
vue.js中mint-ui框架的使用方法
2017/05/12 Javascript
引入外部js脚本加载慢与页面白屏问题的解决
2018/12/10 Javascript
Vue2.0+Vux搭建一个完整的移动webApp项目的示例
2019/03/19 Javascript
微信小程序学习笔记之文件上传、下载操作图文详解
2019/03/29 Javascript
解决layui弹出层layer的area过大被遮挡的问题
2019/09/21 Javascript
解决node.js含有%百分号时发送get请求时浏览器地址自动编码的问题
2019/11/20 Javascript
numpy向空的二维数组中添加元素的方法
2018/11/01 Python
tensorflow tf.train.batch之数据批量读取方式
2020/01/20 Python
超级实用的8个Python列表技巧
2020/08/24 Python
Python os库常用操作代码汇总
2020/11/03 Python
英国领先的男装设计师服装独立零售商:Repertoire Fashion
2020/10/19 全球购物
音乐专业应届生教师求职信
2013/11/04 职场文书
高中生毕业学习总结的自我评价
2013/11/14 职场文书
医学类导师推荐信范文
2013/11/19 职场文书
暑期社会实践方案
2014/02/05 职场文书
质检部经理岗位职责
2014/02/19 职场文书
个人工作能力自我评价
2015/03/05 职场文书
2015年小学语文工作总结
2015/05/25 职场文书
python脚本框架webpy模板赋值实现
2021/11/20 Python