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 28 Python
总结Python中逻辑运算符的使用
May 13 Python
Python函数式编程指南(三):迭代器详解
Jun 24 Python
举例讲解Python设计模式编程中对抽象工厂模式的运用
Mar 02 Python
利用Python如何生成随机密码
Apr 20 Python
Python 实现文件的全备份和差异备份详解
Dec 27 Python
Python使用正则表达式获取网页中所需要的信息
Jan 29 Python
python保留小数位的三种实现方法
Jan 07 Python
Python3-异步进程回调函数(callback())介绍
May 02 Python
浅谈keras 的抽象后端(from keras import backend as K)
Jun 16 Python
python 监控服务器是否有人远程登录(详细思路+代码)
Dec 18 Python
如何利用pygame实现打飞机小游戏
May 30 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+JS实现搜索自动提示(实例)
2013/06/09 PHP
PHP PDO fetch 模式各种参数的输出结果一览
2015/01/07 PHP
docker-compose部署php项目实例详解
2019/07/30 PHP
让innerHTML的脚本也可以运行起来
2006/07/01 Javascript
用正则xmlHttp实现的偷(转)
2007/01/22 Javascript
Javascript的IE和Firefox兼容性汇编(zz)
2007/02/02 Javascript
Javascript-Mozilla和IE中的一个函数直接量的问题分析
2007/08/12 Javascript
JavaScript 学习笔记(六)
2009/12/31 Javascript
9个JavaScript评级/投票插件
2010/01/18 Javascript
Jquery带搜索框的下拉菜单
2013/05/06 Javascript
js取消单选按钮选中并判断对象是否为空
2013/11/14 Javascript
js操作css属性实现div层展开关闭效果的方法
2015/05/11 Javascript
详解angularJs中自定义directive的数据交互
2017/01/13 Javascript
Bootstrap modal 多弹窗之叠加引起的滚动条遮罩阴影问题
2017/02/27 Javascript
js中DOM三级列表(代码分享)
2017/03/20 Javascript
Three.js如何实现雾化效果示例代码
2017/09/27 Javascript
Vue cli+mui 区域滚动的实例代码
2018/01/25 Javascript
详解Vue SPA项目优化小记
2018/07/03 Javascript
jQuery实现的中英文切换功能示例
2019/01/11 jQuery
nuxt中使用路由守卫的方法步骤
2019/01/27 Javascript
RxJS的入门指引和初步应用
2019/06/15 Javascript
javascript设计模式 ? 解释器模式原理与用法实例分析
2020/04/17 Javascript
JavaScript面试中常考的字符串操作方法大全(包含ES6)
2020/05/10 Javascript
python 字符串split的用法分享
2013/03/23 Python
python实现分页效果
2017/10/25 Python
详解tensorflow训练自己的数据集实现CNN图像分类
2018/02/07 Python
对numpy中的where方法嵌套使用详解
2018/10/31 Python
关于pymysql模块的使用以及代码详解
2019/09/01 Python
西班牙第一的网上药房:PromoFarma.com
2017/04/17 全球购物
意大利制造的男鞋和女鞋:SCAROSSO
2018/03/07 全球购物
英国女性时尚品牌:Apricot
2018/12/04 全球购物
标记环网Toke Ring IEEE802.5
2014/05/26 面试题
我爱我校演讲稿
2014/05/21 职场文书
酒店采购员岗位职责
2015/04/03 职场文书
2016年推广普通话宣传周活动总结
2016/04/06 职场文书
修改并编译golang源码的操作步骤
2021/07/25 Golang