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 相关文章推荐
利用aardio给python编写图形界面
Aug 21 Python
Python使用matplotlib填充图形指定区域代码示例
Jan 16 Python
解决pycharm py文件运行后停止按钮变成了灰色的问题
Nov 29 Python
python进行文件对比的方法
Dec 24 Python
Python使用post及get方式提交数据的实例
Jan 24 Python
对python读取zip压缩文件里面的csv数据实例详解
Feb 08 Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
Feb 22 Python
python利用selenium进行浏览器爬虫
Apr 25 Python
python实现倒计时小工具
Jul 29 Python
Python获取时间范围内日期列表和周列表的函数
Aug 05 Python
python多进程 主进程和子进程间共享和不共享全局变量实例
Apr 25 Python
Keras 实现加载预训练模型并冻结网络的层
Jun 15 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数字转汉字代码(算法)
2011/10/08 PHP
利用php递归实现无限分类 格式化数组的详解
2013/06/08 PHP
php+mysqli预处理技术实现添加、修改及删除多条数据的方法
2015/01/30 PHP
PHP JSON格式的中文显示问题解决方法
2015/04/09 PHP
护卫神php套件 php版本升级方法(php5.5.24)
2015/05/10 PHP
PHP标准库 (SPL)――Countable用法示例
2020/06/05 PHP
js tab 选项卡
2009/04/26 Javascript
斜45度寻路实现函数
2009/08/20 Javascript
js类型检查实现代码
2010/10/29 Javascript
JS图像无缝滚动脚本非常好用
2014/02/10 Javascript
Jquery Uploadify上传带进度条的简单实例
2014/02/12 Javascript
jquery实现未经美化的简洁TAB菜单效果
2015/08/28 Javascript
JQuery用户名校验的具体实现
2016/03/18 Javascript
D3.js实现直方图的方法详解
2016/09/25 Javascript
JavaScript仿聊天室聊天记录
2016/12/27 Javascript
JavaScript中的this陷阱的最全收集并整理(没有之一)
2017/02/21 Javascript
vue动态组件实现选项卡切换效果
2017/03/08 Javascript
详解用webpack2.0构建vue2.0超详细精简版
2017/04/05 Javascript
JS实现的简单折叠展开动画效果示例
2018/04/28 Javascript
微信小程序实现蒙版弹出窗功能
2019/09/17 Javascript
jQuery实现本地存储
2020/12/22 jQuery
使用Python中的cookielib模拟登录网站
2015/04/09 Python
基于python实现在excel中读取与生成随机数写入excel中
2018/01/04 Python
python3在同一行内输入n个数并用列表保存的例子
2019/07/20 Python
tensorflow实现对张量数据的切片操作方式
2020/01/19 Python
Python生成器实现简单"生产者消费者"模型代码实例
2020/03/27 Python
使用keras框架cnn+ctc_loss识别不定长字符图片操作
2020/06/29 Python
新百伦折扣店:Joe’s New Balance Outlet
2016/08/20 全球购物
加拿大领先的冒险和户外零售商:Atmosphere
2017/12/19 全球购物
意大利自行车商店:Cingolani Bike Shop
2019/09/03 全球购物
Noon埃及:埃及在线购物
2019/11/26 全球购物
销售人员中英文自荐信
2013/09/22 职场文书
死亡证明书样本说明
2014/10/18 职场文书
2015年办公室个人工作总结
2015/04/20 职场文书
未婚证明范本
2015/06/15 职场文书
kubernetes集群搭建Zabbix监控平台的详细过程
2022/07/07 Servers