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发送SMTP邮件的教程
Apr 29 Python
python实现数值积分的Simpson方法实例分析
Jun 05 Python
Python基础篇之初识Python必看攻略
Jun 23 Python
浅析Python中的赋值和深浅拷贝
Aug 15 Python
Python读取Json字典写入Excel表格的方法
Jan 03 Python
详解Tensorflow数据读取有三种方式(next_batch)
Feb 01 Python
python web基础之加载静态文件实例
Mar 20 Python
Python的numpy库中将矩阵转换为列表等函数的方法
Apr 04 Python
Python 字符串与数字输出方法
Jul 16 Python
Python的条件表达式和lambda表达式实例
Jan 31 Python
python实现文件+参数发送request的实例代码
Jan 05 Python
tensorboard 可视化之localhost:6006不显示的解决方案
May 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无限分类的深入理解
2013/06/02 PHP
php获取域名的google收录示例
2014/03/24 PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
2014/06/26 PHP
基于PHP实现栈数据结构和括号匹配算法示例
2017/08/10 PHP
PHP删除数组中指定下标的元素方法
2018/02/03 PHP
小议Javascript中的this指针
2010/03/18 Javascript
jQuery温习篇 强大的JQuery选择器
2010/04/24 Javascript
jQuery让控件左右移动的三种实现方法
2013/09/08 Javascript
JavaScript模板引擎用法实例
2015/07/10 Javascript
jquery实现LED广告牌旋转系统图片切换效果代码分享
2015/08/26 Javascript
JS使用cookie实现DIV提示框只显示一次的方法
2015/11/05 Javascript
跟我学习javascript的prototype使用注意事项
2015/11/17 Javascript
JS验证逗号隔开可以是中文字母数字
2016/04/22 Javascript
Javascript字符串常用方法详解
2016/07/21 Javascript
JS触摸与手势事件详解
2017/05/09 Javascript
详解React Native 采用Fetch方式发送跨域POST请求
2017/11/15 Javascript
解决layui中的form表单与button的点击事件冲突问题
2018/08/15 Javascript
浅谈layer弹出层按钮颜色修改方法
2019/09/11 Javascript
Vue实现简单计算器案例
2020/02/25 Javascript
bootstrapValidator表单校验、更改状态、新增、移除校验字段的实例代码
2020/05/19 Javascript
JS实现联想、自动补齐国家或地区名称的功能
2020/07/07 Javascript
[56:57]LGD vs VP 2019DOTA2国际邀请赛淘汰赛 胜者组赛BO3 第一场 8.20.mp4
2019/08/22 DOTA
简单介绍Python中的struct模块
2015/04/28 Python
解决项目pycharm能运行,在终端却无法运行的问题
2019/01/19 Python
python使用Plotly绘图工具绘制散点图、线形图
2019/04/02 Python
Python如何实现的二分查找算法
2020/05/27 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
2020/10/26 Python
HTML5中通过li-canvas轻松实现单图、多图、圆角图绘制,单行文字、多行文字等
2018/11/30 HTML / CSS
怎样声明接口
2014/09/19 面试题
行政主管职责范本
2014/03/07 职场文书
元旦获奖感言
2014/03/08 职场文书
公务员政审单位鉴定材料
2014/05/16 职场文书
办公用房租赁协议书
2014/11/29 职场文书
项目建议书
2015/02/04 职场文书
公务员处分决定书
2015/06/25 职场文书
windows server2016安装oracle 11g的图文教程
2022/07/15 Servers