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使用分治法实现求解最大值的方法
May 12 Python
详解Python的Flask框架中生成SECRET_KEY密钥的方法
Jun 07 Python
python中文分词教程之前向最大正向匹配算法详解
Nov 02 Python
Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
Mar 22 Python
python使用opencv驱动摄像头的方法
Aug 03 Python
在Python中os.fork()产生子进程的例子
Aug 08 Python
django写用户登录判定并跳转制定页面的实例
Aug 21 Python
python上selenium的弹框操作实现
Jul 13 Python
python实现图像外边界跟踪操作
Jul 13 Python
Python模块常用四种安装方式
Oct 20 Python
Python列表元素删除和remove()方法详解
Jan 04 Python
pytorch 实现多个Dataloader同时训练
May 29 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时的4个配置修改说明
2015/10/19 PHP
PHP中利用sleep函数实现定时执行功能实现代码
2016/08/25 PHP
PHP+jQuery实现即点即改功能示例
2019/02/21 PHP
laravel5.5安装jwt-auth 生成token令牌的示例
2019/10/24 PHP
JQuery select标签操作代码段
2010/05/16 Javascript
jquery常用技巧及常用方法列表集合
2011/04/06 Javascript
查看图片(前进后退)功能实现js代码
2013/04/24 Javascript
JS实现商品倒计时实现代码
2013/05/03 Javascript
基于jquery扩展漂亮的下拉框可以二次修改
2013/11/19 Javascript
js中window.open打开一个新的页面
2014/08/10 Javascript
jQuery之Deferred对象详解
2014/09/04 Javascript
JavaScript跨域方法汇总
2014/10/16 Javascript
jquery实现动态改变div宽度和高度
2015/05/08 Javascript
JS拖拽组件学习使用
2016/01/19 Javascript
Jq通过td获取同行其它列td的方法
2016/10/05 Javascript
jQuery插件开发发送短信倒计时功能代码
2017/05/09 jQuery
jQuery Ajax使用FormData上传文件和其他数据后端web.py获取
2017/06/11 jQuery
Vue.js实现可配置的登录表单代码详解
2018/03/29 Javascript
js中位运算的运用实例分析
2018/12/11 Javascript
bootstrap中的导航条实例代码详解
2019/05/20 Javascript
移动端底部导航固定配合vue-router实现组件切换功能
2019/06/13 Javascript
vue实现移动端input上传视频、音频
2020/08/18 Javascript
python发送arp欺骗攻击代码分析
2014/01/16 Python
Python聚类算法之基本K均值实例详解
2015/11/20 Python
python基于phantomjs实现导入图片
2016/05/13 Python
Python中sort和sorted函数代码解析
2018/01/25 Python
python使用Matplotlib绘制分段函数
2018/09/25 Python
Python 转移文件至云对象存储的方法
2021/02/07 Python
利用CSS3动画实现圆圈由小变大向外扩散的效果实例
2018/09/10 HTML / CSS
个人校本研修方案
2014/05/26 职场文书
体育专业自荐书
2014/05/29 职场文书
法人身份证明书
2014/10/08 职场文书
2014幼儿园大班工作总结
2014/11/10 职场文书
2015年毕业生个人自荐书
2015/03/24 职场文书
Python办公自动化PPT批量转换操作
2021/09/15 Python
Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶
2021/10/16 Python