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中的一些类型转换函数小结
Feb 10 Python
python使用chardet判断字符串编码的方法
Mar 13 Python
Python程序中使用SQLAlchemy时出现乱码的解决方案
Apr 24 Python
Python文件去除注释的方法
May 25 Python
Python基于Tkinter的HelloWorld入门实例
Jun 17 Python
基于python绘制科赫雪花
Jun 22 Python
Django基础知识与基本应用入门教程
Jul 20 Python
对pandas里的loc并列条件索引的实例讲解
Nov 15 Python
详解如何在Apache中运行Python WSGI应用
Jan 02 Python
对python3 Serial 串口助手的接收读取数据方法详解
Jun 12 Python
用Python自动清理电脑内重复文件,只要10行代码(自动脚本)
Jan 09 Python
Matplotlib可视化之添加让统计图变得简单易懂的注释
Jun 11 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 curl 登录163邮箱并抓取邮箱好友列表的代码(经测试)
2011/04/07 PHP
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
2013/04/08 PHP
基于header的一些常用指令详解
2013/06/06 PHP
php查找字符串中第一个非0的位置截取
2017/02/27 PHP
php显示页码分页类的封装
2017/06/08 PHP
php输出控制函数和输出函数生成静态页面
2019/06/27 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
jQuery版Tab标签切换
2011/03/16 Javascript
ExtJS如何设置与获取radio控件的选取状态
2014/01/22 Javascript
jQuery控制cookie过期时间的方法
2015/04/07 Javascript
原生Javascript插件开发实践
2017/01/18 Javascript
JS仿Base.js实现的继承示例
2017/04/07 Javascript
使用vue2实现购物车和地址选配功能
2018/03/29 Javascript
微信小程序实现折叠与展开文章功能
2018/06/12 Javascript
微信小程序自定义带价格显示日历效果
2018/12/29 Javascript
详解Python 模拟实现生产者消费者模式的实例
2017/08/10 Python
Python使用wxPython实现计算器
2018/01/30 Python
Python爬豆瓣电影实例
2018/02/23 Python
详解pyqt5 动画在QThread线程中无法运行问题
2018/05/05 Python
python2和python3的输入和输出区别介绍
2018/11/20 Python
浅谈python在提示符下使用open打开文件失败的原因及解决方法
2018/11/30 Python
基于python调用psutil模块过程解析
2019/12/20 Python
python实现单张图像拼接与批量图片拼接
2020/03/23 Python
pip install 使用国内镜像的方法示例
2020/04/03 Python
Django中使用Celery的方法步骤
2020/12/07 Python
css3绘制百度的小度熊
2018/10/29 HTML / CSS
智利最大的网上商店:Linio智利
2016/11/24 全球购物
求职简历自荐信范文
2013/10/21 职场文书
教师自我鉴定范文
2013/11/10 职场文书
婚礼答谢词
2015/01/04 职场文书
2015年司机工作总结
2015/04/23 职场文书
2015年营业员工作总结
2015/04/23 职场文书
小学体育教学随笔
2015/08/14 职场文书
Python3 如何开启自带http服务
2021/05/18 Python
Python中的 enumerate和zip详情
2022/05/30 Python
JS实现刷新网页后之前浏览位置保持不变示例详解
2022/08/14 Javascript