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打印斐波拉契数列实例
Jul 07 Python
Python正则表达式使用经典实例
Jun 21 Python
python中import学习备忘笔记
Jan 24 Python
python删除某个字符
Mar 19 Python
python pyheatmap包绘制热力图
Nov 09 Python
浅析python的Lambda表达式
Feb 27 Python
详解如何管理多个Python版本和虚拟环境
May 10 Python
python替换字符串中的子串图文步骤
Jun 19 Python
Pytorch提取模型特征向量保存至csv的例子
Jan 03 Python
python爬虫开发之Request模块从安装到详细使用方法与实例全解
Mar 09 Python
使用Python实现批量ping操作方法
May 06 Python
用Python爬虫破解滑动验证码的案例解析
May 06 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读取PDF内容配合Xpdf的使用
2012/11/24 PHP
网页上facebook分享功能具体实现
2014/01/26 PHP
PHP自动重命名文件实现方法
2014/11/04 PHP
php投票系统之增加与删除投票(管理员篇)
2016/07/01 PHP
PHP生成图像验证码的方法小结(2种方法)
2016/07/18 PHP
新手入门常用代码集锦
2007/01/11 Javascript
Some tips of wmi scripting in jscript (1)
2007/04/03 Javascript
javascript 全角转换实现代码
2009/07/17 Javascript
JavaScript 学习小结(适合新手参考)
2009/07/30 Javascript
js+css实现增加表单可用性之提示文字
2013/06/03 Javascript
JavaScript实现QueryString获取GET参数的方法
2013/07/02 Javascript
jquery隐藏标签和显示标签的实例
2013/11/11 Javascript
jQuery中:first-child选择器用法实例
2014/12/31 Javascript
chrome调试javascript详解
2015/10/21 Javascript
jstree创建无限分级树的方法【基于ajax动态创建子节点】
2016/10/25 Javascript
如何正确理解javascript的模块化
2017/03/02 Javascript
微信小程序之蓝牙的链接
2017/09/26 Javascript
JS写XSS cookie stealer来窃取密码的步骤详解
2017/11/20 Javascript
从vue基础开始创建一个简单的增删改查的实例代码(推荐)
2018/02/11 Javascript
基于iScroll实现内容滚动效果
2018/03/21 Javascript
vue 使用html2canvas将DOM转化为图片的方法
2018/09/11 Javascript
layer弹出子iframe层父子页面传值的实现方法
2018/11/22 Javascript
关于js陀螺仪的理解分析
2019/04/11 Javascript
微信小程序事件对象中e.target和e.currentTarget的区别详解
2019/05/08 Javascript
微信接入之获取用户头像的方法步骤
2019/09/23 Javascript
python读取文本中的坐标方法
2018/10/14 Python
python实现电子词典
2020/03/03 Python
Django全局启用登陆验证login_required的方法
2020/06/02 Python
Python安装并操作redis实现流程详解
2020/10/13 Python
CSS3支持IE6, 7, and 8的边框border属性
2012/12/28 HTML / CSS
使用CSS3的::selection改变选中文本颜色的方法
2015/09/29 HTML / CSS
学生评语大全
2014/04/18 职场文书
个人整改措施书面材料
2014/10/24 职场文书
全国法院系统开展党的群众路线教育实践活动综述(全文)
2014/10/25 职场文书
无保留意见审计报告
2015/06/05 职场文书
你知道Java Spring的两种事务吗
2022/03/16 Java/Android