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中的pydoc模块和distutils模块
Apr 13 Python
python判断一个集合是否包含了另外一个集合中所有项的方法
Jun 30 Python
python中函数默认值使用注意点详解
Jun 01 Python
在python里协程使用同步锁Lock的实例
Feb 19 Python
python使用BeautifulSoup与正则表达式爬取时光网不同地区top100电影并对比
Apr 15 Python
python保存字典和读取字典的实例代码
Jul 07 Python
详解Python文件修改的两种方式
Aug 22 Python
python二分法查找算法实现方法【递归与非递归】
Dec 06 Python
Python批量处理csv并保存过程解析
May 16 Python
详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)
Aug 07 Python
Pandas加速代码之避免使用for循环
May 30 Python
python cv2图像质量压缩的算法示例
Jun 04 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
通达OA公共代码 php常用检测函数
2011/12/14 PHP
PHP设计模式之迭代器模式的深入解析
2013/06/13 PHP
php实现编辑和保存文件的方法
2015/07/20 PHP
CodeIgniter配置之routes.php用法实例分析
2016/01/19 PHP
Yii2框架实现数据库常用操作总结
2017/02/08 PHP
犀利的js 函数集合
2009/06/11 Javascript
JavaScript 原型与继承说明
2010/06/09 Javascript
jquery keypress,keyup,onpropertychange键盘事件
2010/06/25 Javascript
location.href语句与火狐不兼容的问题
2010/07/04 Javascript
JavaScript数据结构和算法之二叉树详解
2015/02/11 Javascript
Javascript实现字数统计
2015/07/03 Javascript
jQuery ajax分页插件实例代码
2016/01/27 Javascript
JS转换HTML转义符的方法
2016/08/24 Javascript
javascript iframe跨域详解
2016/10/26 Javascript
初探js和简单隐藏效果的实例
2017/11/23 Javascript
微信小程序 功能函数小结(手机号验证*、密码验证*、获取验证码*)
2017/12/08 Javascript
babel的使用及安装配置教程
2018/02/22 Javascript
JavaScript 中定义函数用 var foo = function () {} 和 function foo()区别介绍
2018/03/01 Javascript
js使用cookie实现记住用户名功能示例
2019/06/13 Javascript
Vue数据绑定实例写法
2019/08/06 Javascript
js 对象使用的小技巧实例分析
2019/11/08 Javascript
Django在win10下的安装并创建工程
2017/11/20 Python
python实现逆序输出一个数字的示例讲解
2018/06/25 Python
Python一行代码实现快速排序的方法
2019/04/30 Python
python利用re,bs4,requests模块获取股票数据
2019/07/29 Python
Python操作Mongodb数据库的方法小结
2019/09/10 Python
python用tkinter实现一个简易能进行随机点名的界面
2020/09/27 Python
英国领先的男装设计师服装独立零售商:Repertoire Fashion
2020/10/19 全球购物
幼儿园亲子活动方案
2014/01/29 职场文书
开业庆典策划方案
2014/02/18 职场文书
电子商务专业求职信
2014/03/08 职场文书
走群众路线学习笔记
2014/11/06 职场文书
销售助理岗位职责
2015/02/11 职场文书
培训学校2015年度工作总结
2015/07/20 职场文书
《揠苗助长》教学反思
2016/02/20 职场文书
python字符串的多行输出的实例详解
2021/06/08 Python