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通过floor函数舍弃小数位的方法
Mar 17 Python
python中list常用操作实例详解
Jun 03 Python
安装Python和pygame及相应的环境变量配置(图文教程)
Jun 04 Python
python爬取微信公众号文章
Aug 31 Python
使用Python3+PyQT5+Pyserial 实现简单的串口工具方法
Feb 13 Python
Python中的random.uniform()函数教程与实例解析
Mar 02 Python
对python中url参数编码与解码的实例详解
Jul 25 Python
100行Python代码实现每天不同时间段定时给女友发消息
Sep 27 Python
Python实现计算长方形面积(带参数函数demo)
Jan 18 Python
解决pycharm下pyuic工具使用的问题
Apr 08 Python
Python tkinter之Bind(绑定事件)的使用示例
Feb 05 Python
如何用 Python 子进程关闭 Excel 自动化中的弹窗
May 07 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_pconnect()函数使用介绍
2012/02/05 PHP
PHP批量上传图片的具体实现方法介绍.
2014/02/26 PHP
session 加入redis的实现代码
2016/07/15 PHP
PHP如何实现订单的延时处理详解
2017/12/30 PHP
php删除一个路径下的所有文件夹和文件的方法
2018/02/07 PHP
JavaScript入门教程(11) js事件处理
2009/01/31 Javascript
图片连续滚动代码[兼容IE/firefox]
2009/06/11 Javascript
传智播客学习之JavaScript基础篇
2009/11/13 Javascript
poshytip 基于jquery的 插件 主要用于显示微博人的图像和鼠标提示等
2012/10/12 Javascript
Bootstrap中点击按钮后变灰并显示加载中实例代码
2016/09/23 Javascript
关于Jquery中的事件绑定总结
2016/10/26 Javascript
JS定时检测任务任务完成后执行下一步的解决办法
2016/12/22 Javascript
JS全角与半角转化实例(分享)
2017/07/04 Javascript
详解Vue-cli webpack移动端自动化构建rem问题
2018/04/07 Javascript
详解vue表单——小白速看
2018/04/08 Javascript
谈谈JavaScript中super(props)的重要性
2019/02/12 Javascript
Vue实现仿iPhone悬浮球的示例代码
2020/03/13 Javascript
js正则表达式简单校验方法
2021/01/03 Javascript
python批量下载图片的三种方法
2013/04/22 Python
Python自动重试HTTP连接装饰器
2015/04/28 Python
python检测某个变量是否有定义的方法
2015/05/20 Python
深入理解python中的闭包和装饰器
2016/06/12 Python
python实现微信小程序自动回复
2018/09/10 Python
Python中fnmatch模块的使用详情
2018/11/30 Python
Python turtle绘画象棋棋盘
2019/08/21 Python
解决python明明pip安装成功却找不到包的问题
2019/08/28 Python
css3 column实现卡片瀑布流布局的示例代码
2018/06/22 HTML / CSS
h5网页水印SDK的实现代码示例
2019/02/19 HTML / CSS
西班牙手机之家:Phone House
2018/10/18 全球购物
课程设计心得体会
2013/12/28 职场文书
机关会计岗位职责
2014/04/08 职场文书
财会专业毕业生自荐信
2014/07/09 职场文书
2016元旦晚会主持词开场白和结束语
2015/12/04 职场文书
CSS中em的正确打开方式详解
2021/04/08 HTML / CSS
JS代码编译器Monaco使用方法
2021/06/11 Javascript
Python按顺序遍历并读取文件夹中文件
2022/04/29 Python