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实现爬虫下载漫画示例
Feb 16 Python
python开发中module模块用法实例分析
Nov 12 Python
Python实现代码统计工具(终极篇)
Jul 04 Python
详解使用pymysql在python中对mysql的增删改查操作(综合)
Jan 18 Python
Python 结巴分词实现关键词抽取分析
Oct 21 Python
解决python中无法自动补全代码的问题
Dec 04 Python
python TK库简单应用(实时显示子进程输出)
Oct 29 Python
基于PyQT实现区分左键双击和单击
May 19 Python
python线程池 ThreadPoolExecutor 的用法示例
Oct 10 Python
python从ftp获取文件并下载到本地
Dec 05 Python
python 实现图片裁剪小工具
Feb 02 Python
利用python实现后端写网页(flask框架)
Feb 28 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/06/04 PHP
刷新PHP缓冲区为你的站点加速
2015/10/10 PHP
[原创]解决wincache不支持64位PHP5.5/5.6的问题(提供64位wincache下载)
2016/06/22 PHP
php 获取文件行数的方法总结
2016/10/11 PHP
PHP中时间加减函数strtotime用法分析
2017/04/26 PHP
PHP实现的数组和XML文件相互转换功能示例
2018/03/15 PHP
PHP删除字符串中非字母数字字符方法总结
2019/01/20 PHP
解决PHP使用CURL发送GET请求时传递参数的问题
2019/10/11 PHP
动态控制Table的js代码
2007/03/07 Javascript
jQuery 操作下拉列表框实现代码
2010/02/22 Javascript
javascript 子窗体父窗体相互传值方法
2010/05/31 Javascript
jQuery中对节点进行操作的相关介绍
2013/04/16 Javascript
使用jquery实现放大镜效果
2014/09/02 Javascript
jQuery动态效果显示人物结构关系图的方法
2015/05/07 Javascript
纯js代码实现未知宽高的元素在指定元素中垂直水平居中显示
2015/09/12 Javascript
Vue.js报错Failed to resolve filter问题的解决方法
2016/05/25 Javascript
js 判断各种数据类型的简单方法(推荐)
2016/08/29 Javascript
详解nodejs 文本操作模块-fs模块(五)
2016/12/23 NodeJs
ES6的解构赋值实例详解
2019/05/06 Javascript
深入了解JavaScript 的 WebAssembly
2019/06/15 Javascript
vue 实现input表单元素的disabled示例
2019/10/28 Javascript
JavaScript canvas实现跟随鼠标事件
2020/02/10 Javascript
nodejs制作小爬虫功能示例
2020/02/24 NodeJs
编写v-for循环的技巧汇总
2020/12/01 Javascript
[05:04]完美世界携手游戏风云打造 卡尔工作室地图界面篇
2013/04/23 DOTA
python输入错误密码用户锁定实现方法
2017/11/27 Python
Python中的二维数组实例(list与numpy.array)
2018/04/13 Python
在Python中字符串、列表、元组、字典之间的相互转换
2019/11/15 Python
对Matlab中共轭、转置和共轭装置的区别说明
2020/05/11 Python
python安装和pycharm环境搭建设置方法
2020/05/27 Python
Python try except finally资源回收的实现
2021/01/25 Python
CSS3 制作绽放的莲花采用效果叠加实现
2013/01/31 HTML / CSS
澳大利亚宠物食品和用品商店:PETstock
2020/01/02 全球购物
几道PHP面试题
2013/04/14 面试题
护士辞职信范文
2014/01/19 职场文书
pytorch 使用半精度模型部署的操作
2021/05/24 Python