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写的图片蜘蛛人代码
Aug 27 Python
Python中实现两个字典(dict)合并的方法
Sep 23 Python
Python求导数的方法
May 09 Python
python实现发送邮件及附件功能
Mar 02 Python
virtualenv实现多个版本Python共存
Aug 21 Python
学生信息管理系统python版
Oct 17 Python
利用Pycharm断点调试Python程序的方法
Nov 29 Python
Python设计模式之解释器模式原理与用法实例分析
Jan 10 Python
Django中ORM外键和表的关系详解
May 20 Python
Python Pandas中根据列的值选取多行数据
Jul 08 Python
python 成功引入包但无法正常调用的解决
Mar 09 Python
python入门教程之基本算术运算符
Nov 13 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引用返回用法示例
2016/05/28 PHP
wordpress网站转移到本地运行测试的方法
2017/03/15 PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
2020/06/06 PHP
JQuery打造PHP的AJAX表单提交实例
2009/11/03 Javascript
如何使用jQUery获取选中radio对应的值(一句代码)
2013/06/03 Javascript
Bootstrap图片轮播组件使用实例解析
2016/06/30 Javascript
jQuery简易时光轴实现方法示例
2017/03/13 Javascript
Vue实现一个返回顶部backToTop组件
2017/07/25 Javascript
Vue中的$set的使用实例代码
2018/10/08 Javascript
微信小程序云开发获取文件夹下所有文件(推荐)
2019/11/14 Javascript
JS数组转字符串实现方法解析
2020/09/04 Javascript
Vue实现点击当前行变色
2020/12/14 Vue.js
在Django的通用视图中处理Context的方法
2015/07/21 Python
Python提取Linux内核源代码的目录结构实现方法
2016/06/24 Python
深入理解Python中range和xrange的区别
2017/11/26 Python
Python实现自动上京东抢手机
2018/02/06 Python
Python3使用turtle绘制超立方体图形示例
2018/06/19 Python
python训练数据时打乱训练数据与标签的两种方法小结
2018/11/08 Python
Python多图片合并PDF的方法
2019/01/03 Python
python实现字符串加密 生成唯一固定长度字符串
2019/03/22 Python
Pytorch 多块GPU的使用详解
2019/12/31 Python
python连接打印机实现打印文档、图片、pdf文件等功能
2020/02/07 Python
python生成13位或16位时间戳以及反向解析时间戳的实例
2020/03/03 Python
使用 django orm 写 exists 条件过滤实例
2020/05/20 Python
解决Keras中CNN输入维度报错问题
2020/06/29 Python
python生成xml时规定dtd实例方法
2020/09/21 Python
matplotlib之pyplot模块坐标轴标签设置使用(xlabel()、ylabel())
2021/02/22 Python
JENNIFER BEHR官网:各种耳环和发饰
2020/06/07 全球购物
淘宝网店营销策划书
2014/01/11 职场文书
商业项目策划方案
2014/06/05 职场文书
电话客服工作职责
2014/07/27 职场文书
五好家庭申报材料
2014/12/20 职场文书
文艺部部长竞选稿
2015/11/21 职场文书
范文之农村基层党建工作报告
2019/10/24 职场文书
MySQL 不等于的三种使用及区别
2021/06/03 MySQL
详解Go语言Slice作为函数参数的使用
2021/07/02 Golang