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实现的金山快盘的签到程序
Jan 17 Python
Python 字符串操作方法大全
Mar 11 Python
使用Python判断IP地址合法性的方法实例
Mar 13 Python
Python中的exec、eval使用实例
Sep 23 Python
python监控文件或目录变化
Jun 07 Python
分享Python开发中要注意的十个小贴士
Aug 30 Python
解决py2exe打包后,总是多显示一个DOS黑色窗口的问题
Jun 21 Python
python反转列表的三种方式解析
Nov 08 Python
python PIL/cv2/base64相互转换实例
Jan 09 Python
python numpy库linspace相同间隔采样的实现
Feb 25 Python
如何更换python默认编辑器的背景色
Aug 10 Python
教你怎么用Python处理excel实现自动化办公
Apr 30 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输出数组中重名的元素的几种处理方法
2012/09/05 PHP
PHP使用pear自带的mail类库发邮件的方法
2015/07/08 PHP
PHP加密技术的简单实现
2016/09/04 PHP
yii2的restful api路由实例详解
2019/05/14 PHP
JS打开新窗口的2种方式
2013/04/18 Javascript
js获取url中的参数且参数为中文时通过js解码
2014/03/19 Javascript
原生javascript实现Tab选项卡切换功能
2015/01/12 Javascript
jquery插件jquery.LightBox.js实现点击放大图片并左右点击切换效果(附demo源码下载)
2016/02/25 Javascript
AngularJS 入门教程之HTML DOM实例详解
2016/07/28 Javascript
backbone简介_动力节点Java学院整理
2017/07/14 Javascript
Js判断H5上下滑动方向及滑动到顶部和底部判断的示例代码
2017/11/15 Javascript
学习Vue组件实例
2018/04/28 Javascript
vue 项目build错误异常的解决方法
2019/04/22 Javascript
用 js 写一个 js 解释器过程详解
2019/08/02 Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
2020/04/14 Javascript
[00:32]2018DOTA2亚洲邀请赛OpTic出场
2018/04/03 DOTA
python实现倒计时的示例
2014/02/14 Python
Python检测QQ在线状态的方法
2015/05/09 Python
Python中pygame安装方法图文详解
2015/11/11 Python
Python实现类似比特币的加密货币区块链的创建与交易实例
2018/03/20 Python
python pycharm的安装及其使用
2019/10/11 Python
Django 创建后台,配置sqlite3教程
2019/11/18 Python
python tkinter 设置窗口大小不可缩放实例
2020/03/04 Python
Python-split()函数实例用法讲解
2020/12/18 Python
使用HTML和CSS3绘制基本卡通图案的示例分享
2015/11/06 HTML / CSS
怀旧香味蜡烛:Homesick
2019/11/02 全球购物
教师自我鉴定范文
2014/03/20 职场文书
毕业生个人自荐书
2015/03/05 职场文书
2015年项目经理工作总结
2015/04/30 职场文书
费城故事观后感
2015/06/10 职场文书
2015大一新生军训感言
2015/08/01 职场文书
高一语文教学反思
2016/02/16 职场文书
深入理解以DEBUG方式线程的底层运行原理
2021/06/21 Java/Android
gateway与spring-boot-starter-web冲突问题的解决
2021/07/16 Java/Android
如何使用SQL Server语句创建表
2022/04/12 SQL Server
MySQL批量更新不同表中的数据
2022/05/11 MySQL