Python 私有属性和私有方法应用场景分析


Posted in Python onJune 19, 2020

类的私有属性和方法

Python是个开放的语言,默认情况下所有的属性和方法都是公开的 或者叫公有方法,不像C++和 Java中有明确的public,private 关键字来区分私有公有。

Python默认的成员函数和成员变量都是公开的,类的私有属性指只有在类的内部使用的属性或方法,表现形式为以“__“ 属性名或方法名以双下划线开头。

class Test(object):
  __count = 0  # 私有属性 __count

  def get_count(self):
    return self.__count  # 类的内部可以使用私有属性

  def set_count(self, value):
    if self.__check_value(value):  # 在类的内部调用类的私有方法
      self.__class__.__count = value

  def __check_value(self, value):  # 定义类的私有方法 检查参数
    if isinstance(value, int):
      return True

a = Test()
print(a.get_count())
a.set_count(100)
print(a.get_count())
#a.__check_value(10)  # 调用私有方法会报错
#print(a.__count)			# 直接访问私有属性也会报错

应用场景

对于一些敏感的数据,我们不希望直接被的函数调用,或者不希望草率的直接 object.key = value 来修改,我们可以选择将属性声名为私有的,这样从外部时无法访问该属性的,也就不能修改了,但是依然可以修改属性字典的方法来修改。

# 当然 可以使用 @proprety 
class Person(object):
  __name = 'Monkey'

  def update_name(self, name):
    self.__name = name

  def get_name(self):
    return self.__name

p = Person()
p.update_name('BlackMonkey')
print(p.get_name())  # BlackMonkey
print(p.__name)  # 报错 AttributeError: 'Person' object has no attribute '__name'

下面在看下python中私有属性和受保护的属性的实例代码

具体代码如下所示:

class People:
 
  def __init__(self, name, age):
    self.name = name
    self.age = age
    self._protect_var = 10       # 受保护的成员,使用一个下划线_,它仅仅是提示成员受保护,但可以被更改
    self.__private_var = 10       # 使用双下划线__可以定义私有属性
 
  def sayhi(self):
    print("Hi, my name is {}, and I'm {}".format(self.name, self.age))
 
  def get_var(self):
    print(self.__private_var)
 
  def set_var(self, var):
    self.__private_var = var
 
 
# class instance 类的实例化
 
someone = People(name='Jack', age=20)    # 类的实例化
print(someone._protect_var)         # 10 受保护的成员可以被打印
someone._protect_var = 20          # 受保护的成员可以被修改
print(someone._protect_var)         # 20 可以被修改
 
# print(someone.__private_var)          # 报错 AttributeError: 'People' object has no attribute '__private_var'
someone.__private_var = 30          # 此处可以被修改,不会报错(此处表示私有属性可以被修改,具体原因可以百度)
print(someone.__private_var)         # 可以打印,不会报错
 
someone.get_var()              # 10 此处可以发现,__private_var在上面被改成30,但此处打印出来却是10(具体原因可以百度)
someone.set_var(40)
someone.get_var()              # 40 这里通过someone.set_var(40)改成了40
 
print(dir(someone))             # dir()打印出someone这个对象支持的属性和方法
# ['_People__private_var', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__private_var', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_protect_var', 'age', 'get_var', 'name', 'sayhi', 'set_var']
# 在类的内部重命名了 __private_var重命名成_People__private_var
 
someone._People__private_var = 100
someone.get_var()              # 100 通过_People__private_var把__private_var的值改成了100

总结

到此这篇关于Python 私有属性和私有方法应用场景分析的文章就介绍到这了,更多相关python 私有属性和私有方法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python实现电子词典
Apr 23 Python
Python3基础之基本数据类型概述
Aug 13 Python
Pandas 对Dataframe结构排序的实现方法
Apr 10 Python
python验证码识别教程之灰度处理、二值化、降噪与tesserocr识别
Jun 04 Python
Django中的forms组件实例详解
Nov 08 Python
python 提取tuple类型值中json格式的key值方法
Dec 31 Python
用Python PIL实现几个简单的图片特效
Jan 18 Python
Django uwsgi Nginx 的生产环境部署详解
Feb 02 Python
python接口自动化测试之接口数据依赖的实现方法
Apr 26 Python
python3 自动打印出最新版本执行的mysql2redis实例
Apr 09 Python
使用Python爬取Json数据的示例代码
Dec 07 Python
python中的class_static的@classmethod的巧妙用法
Jun 22 Python
Python基于network模块制作电影人物关系图
Jun 19 #Python
keras中的History对象用法
Jun 19 #Python
python中rc1什么意思
Jun 19 #Python
解决keras backend 越跑越慢问题
Jun 18 #Python
Python基于Twilio及腾讯云实现国际国内短信接口
Jun 18 #Python
详解Windows下PyCharm安装Numpy包及无法安装问题解决方案
Jun 18 #Python
解决Keras中Embedding层masking与Concatenate层不可调和的问题
Jun 18 #Python
You might like
PHP安装攻略:常见问题解答(二)
2006/10/09 PHP
实用函数9
2007/11/08 PHP
php计算当前程序执行时间示例
2014/04/24 PHP
destoon设置自定义搜索的方法
2014/06/21 PHP
laravel-admin select框默认选中的方法
2019/10/03 PHP
JavaScript 高级语法介绍
2009/06/15 Javascript
关于jQuery中.attr()和.prop()的问题探讨
2013/09/06 Javascript
JS实现重新加载当前页面
2016/11/29 Javascript
angular forEach方法遍历源码解读
2017/01/25 Javascript
Javascript迭代、递推、穷举、递归常用算法实例讲解
2019/02/01 Javascript
详解VUE调用本地json的使用方法
2019/05/15 Javascript
vue和iview实现Scroll 数据无限滚动功能
2019/10/31 Javascript
vue print.js打印支持Echarts图表操作
2020/11/13 Javascript
一起来了解一下JavaScript的预编译(小结)
2021/03/01 Javascript
python多重继承新算法C3介绍
2014/09/28 Python
python实现多线程抓取知乎用户
2016/12/12 Python
python 安装virtualenv和virtualenvwrapper的方法
2017/01/13 Python
Python tkinter实现的图片移动碰撞动画效果【附源码下载】
2018/01/04 Python
使用python进行文本预处理和提取特征的实例
2018/06/05 Python
python+opencv像素的加减和加权操作的实现
2019/07/14 Python
Django框架视图函数设计示例
2019/07/29 Python
关于tf.nn.dynamic_rnn返回值详解
2020/01/20 Python
python文件及目录操作代码汇总
2020/07/08 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
2021/02/25 Python
详解HTML5中的拖放事件(Drag 和 drop)
2016/11/14 HTML / CSS
锐步美国官方网站:Reebok美国
2018/01/10 全球购物
ghd官网:英国ghd直发器品牌
2018/05/04 全球购物
爱尔兰电脑、家电和家具购物网站:Buy It Direct
2019/07/09 全球购物
阿拉伯时尚购物网站:Nisnass
2021/02/07 全球购物
计算机通信工程专业毕业生推荐信
2013/12/24 职场文书
ktv中秋节活动方案
2014/01/30 职场文书
群众路线表态发言材料
2014/10/17 职场文书
2015年机关党建工作总结
2015/05/22 职场文书
css实现文章分割线样式的多种方法总结
2021/04/21 HTML / CSS
写一个Python脚本自动爬取Bilibili小视频
2021/04/24 Python
mysql 如何获取两个集合的交集/差集/并集
2021/06/08 MySQL