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 类的继承实例详解
Mar 25 Python
Python的mysql数据库的更新如何实现
Jul 31 Python
利用python实现简单的邮件发送客户端示例
Dec 23 Python
python实现m3u8格式转换为mp4视频格式
Feb 28 Python
python中将一个全部为int的list 转化为str的list方法
Apr 09 Python
python的中异常处理机制
Aug 30 Python
Python根据欧拉角求旋转矩阵的实例
Jan 28 Python
python命令 -u参数用法解析
Oct 24 Python
Python如何使用函数做字典的值
Nov 30 Python
如何在mac下配置python虚拟环境
Jul 06 Python
Python 的 __str__ 和 __repr__ 方法对比
Sep 02 Python
python 实现Requests发送带cookies的请求
Feb 08 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
在JavaScript中调用php程序
2009/03/09 PHP
探讨如何使用SimpleXML函数来加载和解析XML文档
2013/06/07 PHP
使用PHP生成二维码的方法汇总
2015/07/22 PHP
PHP进行批量任务处理不超时的解决方法
2016/07/11 PHP
jquery 指南/入门基础
2007/11/30 Javascript
javascript中有趣的反柯里化深入分析
2012/12/05 Javascript
jQuery中filter()和find()的区别深入了解
2013/09/25 Javascript
js拼接html注意问题示例探讨
2014/07/14 Javascript
js获取浏览器基本信息大全
2014/11/27 Javascript
每天一篇javascript学习小结(Function对象)
2015/11/16 Javascript
javascript学习指南之回调问题
2016/04/23 Javascript
JQuery动态添加Select的Option元素实现方法
2016/08/29 Javascript
浅谈jQuery添加的HTML,JS失效的问题
2016/10/05 Javascript
JS自定义函数对web前端上传的文件进行类型大小判断
2016/10/19 Javascript
JavaScript trim 实现去除字符串首尾指定字符的简单方法
2016/12/27 Javascript
bootstrap3使用bootstrap datetimepicker日期插件
2017/05/24 Javascript
使用javaScript实现鼠标拖拽事件
2020/04/03 Javascript
JS中FormData类实现文件上传
2020/03/27 Javascript
解决vue页面刷新,数据丢失的问题
2020/11/24 Vue.js
[15:15]教你分分钟做大人:狙击手
2014/10/30 DOTA
[02:03]完美世界DOTA2联赛10月30日赛事集锦
2020/10/31 DOTA
Python脚本实现自动将数据库备份到 Dropbox
2017/02/06 Python
python3.6+django2.0+mysql搭建网站过程详解
2019/07/24 Python
基于Python执行dos命令并获取输出的结果
2019/12/30 Python
python文件处理fileinput使用方法详解
2020/01/02 Python
Python编程快速上手——Excel到CSV的转换程序案例分析
2020/02/28 Python
python实现人像动漫化的示例代码
2020/05/17 Python
Pycharm编辑器功能之代码折叠效果的实现代码
2020/10/15 Python
Web页面中八种创建多列等高(等高列布局)的实现技术
2012/12/24 HTML / CSS
Bonprix法国:时尚、鞋子、家居
2020/12/29 全球购物
工厂厂长岗位职责
2013/11/08 职场文书
电子商务专业自荐信
2014/06/02 职场文书
禁毒宣传标语
2014/06/19 职场文书
企业领导班子四风对照检查材料
2014/09/27 职场文书
2015年党员公开承诺书范文
2015/01/22 职场文书
Win10本地连接不见了怎么恢复? win10系统电脑本地连接不见了解决方法
2023/01/09 数码科技