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编写简单网络爬虫抓取视频下载资源
Nov 04 Python
Python中文竖排显示的方法
Jul 28 Python
深入源码解析Python中的对象与类型
Dec 11 Python
Python实现新浪博客备份的方法
Apr 27 Python
python实现求解列表中元素的排列和组合问题
Mar 15 Python
对Python3+gdal 读取tiff格式数据的实例讲解
Dec 04 Python
Python assert语句的简单使用示例
Jul 28 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
Aug 19 Python
python 使用while循环输出*组成的菱形实例
Apr 12 Python
浅谈pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式
May 25 Python
Django ModelForm组件原理及用法详解
Oct 12 Python
python+pyhyper实现识别图片中的车牌号思路详解
Dec 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读取mssql的ntext字段返回值为空的解决方法
2014/12/30 PHP
php去除二维数组的重复项方法
2015/11/03 PHP
php微信开发自定义菜单
2016/08/27 PHP
php的常量和变量实例详解
2017/06/27 PHP
Laravel框架实现的记录SQL日志功能示例
2018/06/19 PHP
类似GMAIL的Ajax信息反馈显示
2010/02/16 Javascript
Javascript基础教程之break和continue语句
2015/01/18 Javascript
JQuery显示隐藏DIV的方法及代码实例
2015/04/16 Javascript
js实现Form栏显示全格式时间时钟效果代码
2015/08/19 Javascript
jQuery实现连续动画效果实例分析
2015/10/09 Javascript
Google 地图获取API Key详细教程
2016/08/06 Javascript
js使用Replace结合正则替换重复出现的字符串功能示例
2016/12/27 Javascript
jQuery实现分页功能(含ajax请求、后台数据、附完整demo)
2017/04/03 jQuery
JS中Map和ForEach的区别
2018/02/05 Javascript
详解javascript中的babel到底是什么
2018/06/21 Javascript
详解Vue SPA项目优化小记
2018/07/03 Javascript
原生JS实现动态加载js文件并在加载成功后执行回调函数的方法
2020/12/30 Javascript
微信小程序实现tab左右切换效果
2020/11/15 Javascript
vue项目搭建以及全家桶的使用详细教程(小结)
2018/12/19 Javascript
微信小程序提取公用函数到util.js及使用方法示例
2019/01/10 Javascript
详解微信小程序回到顶部的两种方式
2019/05/09 Javascript
[03:56]显微镜下的DOTA2第十一期——鬼畜的死亡先知播音员
2014/06/23 DOTA
利用python批量修改word文件名的方法示例
2017/10/17 Python
TensorFlow实现非线性支持向量机的实现方法
2018/04/28 Python
详解python3中的真值测试
2018/08/13 Python
Python多线程编程之多线程加锁操作示例
2018/09/06 Python
flask session组件的使用示例
2018/12/25 Python
python中bytes和str类型的区别
2019/10/21 Python
Django media static外部访问Django中的图片设置教程
2020/04/07 Python
css3学习心得分享
2013/08/19 HTML / CSS
德国童装购物网站:NICKI´S.com
2018/04/20 全球购物
SQL SERVER面试资料
2013/03/30 面试题
入学生会自荐书范文
2014/02/05 职场文书
留学推荐信英文范文
2015/03/26 职场文书
python自动统计zabbix系统监控覆盖率的示例代码
2021/04/03 Python
Python之Matplotlib绘制热力图和面积图
2022/04/13 Python