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中模拟enum枚举类型的5种方法分享
Nov 22 Python
Python3.4编程实现简单抓取爬虫功能示例
Sep 14 Python
Numpy掩码式数组详解
Apr 17 Python
Python Django中间件,中间件函数,全局异常处理操作示例
Nov 08 Python
Python读取分割压缩TXT文本文件实例
Feb 14 Python
Python数据相关系数矩阵和热力图轻松实现教程
Jun 16 Python
Pytorch 高效使用GPU的操作
Jun 27 Python
基于python实现操作redis及消息队列
Aug 27 Python
Django框架安装及项目创建过程解析
Sep 14 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
Nov 24 Python
Python爬虫之爬取哔哩哔哩热门视频排行榜
Apr 28 Python
python not运算符的实例用法
Jun 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&MYSQL分页原理及实现
2007/01/02 PHP
php 执行系统命令的方法
2009/07/07 PHP
学习从实践开始之jQuery插件开发 菜单插件开发
2012/05/03 Javascript
基于KMP算法JavaScript的实现方法分析
2013/05/03 Javascript
jQuery 滑动方法slideDown向下滑动元素
2014/01/16 Javascript
JQuery ztree带筛选、异步加载实例讲解
2016/02/25 Javascript
NodeJS远程代码执行
2016/08/28 NodeJs
AngularJS出现$http异步后台无法获取请求参数问题的解决方法
2016/11/03 Javascript
javascript实现滑动解锁功能
2017/03/22 Javascript
详解vue.js移动端导航navigationbar的封装
2017/07/05 Javascript
JS实现提交表单前的数字及邮箱校检功能
2017/11/13 Javascript
移动web开发之touch事件实例详解
2018/01/17 Javascript
详解webpack4之splitchunksPlugin代码包分拆
2018/12/04 Javascript
Vue实例的对象参数options的几个常用选项详解
2019/11/08 Javascript
vue列表数据发生变化指令没有更新问题及解决方法
2020/01/16 Javascript
Sublime Text3 配置 NodeJs 环境的方法
2020/05/20 NodeJs
Vue实现简易购物车页面
2020/12/30 Vue.js
Python-基础-入门 简介
2014/08/09 Python
整理Python 常用string函数(收藏)
2016/05/30 Python
python WindowsError的错误代码详解
2017/07/23 Python
Python设计模式之代理模式简单示例
2018/01/09 Python
python re.sub()替换正则的匹配内容方法
2019/07/22 Python
Django 权限认证(根据不同的用户,设置不同的显示和访问权限)
2019/07/24 Python
python自动发微信监控报警
2019/09/06 Python
在Pytorch中计算自己模型的FLOPs方式
2019/12/30 Python
python读取多层嵌套文件夹中的文件实例
2020/02/27 Python
简单了解如何封装自己的Python包
2020/07/08 Python
Crocs美国官方网站:卡骆驰洞洞鞋
2017/08/04 全球购物
Belvilla法国:休闲度假房屋出租
2020/10/03 全球购物
平安家庭示范户事迹
2014/06/02 职场文书
企业口号大全
2014/06/12 职场文书
小学生感恩老师演讲稿
2014/08/28 职场文书
县委班子四风对照检查材料思想汇报
2014/09/29 职场文书
村干部四风问题整改措施
2014/09/30 职场文书
2015年机关作风和效能建设工作总结
2015/07/23 职场文书
面试分析分布式架构Redis热点key大Value解决方案
2022/03/13 Redis