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实现问号表达式(?)的方法
Nov 27 Python
使用python删除nginx缓存文件示例(python文件操作)
Mar 26 Python
总结网络IO模型与select模型的Python实例讲解
Jun 27 Python
python 函数传参之传值还是传引用的分析
Sep 07 Python
详谈Python高阶函数与函数装饰器(推荐)
Sep 30 Python
Python中多个数组行合并及列合并的方法总结
Apr 12 Python
python3之模块psutil系统性能信息使用
May 30 Python
python实现字符串中字符分类及个数统计
Sep 28 Python
一篇文章搞懂Python的类与对象名称空间
Dec 10 Python
Django框架模板注入操作示例【变量传递到模板】
Dec 19 Python
不归路系列:Python入门之旅-一定要注意缩进!!!(推荐)
Apr 16 Python
Python3分析处理声音数据的例子
Aug 27 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 中文乱码解决办法总结分析
2009/07/30 PHP
基于PHP选项与信息函数的使用详解
2013/05/10 PHP
php arsort 数组降序排序详细介绍
2016/11/17 PHP
PHP模糊查询技术实例分析【附源码下载】
2019/03/07 PHP
YII框架常用技巧总结
2019/04/27 PHP
JavaScript延迟加载
2021/03/09 Javascript
Javascript this关键字使用分析
2008/10/21 Javascript
Extjs学习笔记之五 一个小细节renderTo和applyTo的区别
2010/01/07 Javascript
理解Javascript_08_函数对象
2010/10/15 Javascript
深入理解JavaScript系列(7) S.O.L.I.D五大原则之开闭原则OCP
2012/01/15 Javascript
JavaScript高级程序设计(第3版)学习笔记6 初识js对象
2012/10/11 Javascript
JS判断移动端访问设备并加载对应CSS样式
2014/06/13 Javascript
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
JavaScript处理解析JSON数据过程详解
2015/09/11 Javascript
利用jQuery设计一个简单的web音乐播放器的实例分享
2016/03/08 Javascript
jQuery替换节点用法示例(使用replaceWith方法)
2016/09/08 Javascript
ES6入门教程之let和const命令详解
2017/05/17 Javascript
bmob js-sdk 在vue中的使用教程
2018/01/21 Javascript
基于vue2的canvas时钟倒计时组件步骤解析
2018/11/05 Javascript
js array数组对象操作方法汇总
2019/03/18 Javascript
Python调用C语言开发的共享库方法实例
2015/03/18 Python
python smtplib模块发送SSL/TLS安全邮件实例
2015/04/08 Python
在Python操作时间和日期之asctime()方法的使用
2015/05/22 Python
详解用Python处理HTML转义字符的5种方式
2017/12/27 Python
Python实现识别手写数字 简易图片存储管理系统
2018/01/29 Python
Pandas 解决dataframe的一列进行向下顺移问题
2019/12/27 Python
Tensorflow 卷积的梯度反向传播过程
2020/02/10 Python
Python Scrapy框架:通用爬虫之CrawlSpider用法简单示例
2020/04/11 Python
python爬取招聘要求等信息实例
2020/11/20 Python
Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)
2021/01/28 Python
CSS3美化表单控件全集
2016/06/29 HTML / CSS
机电一体化大学生求职信
2013/11/08 职场文书
干部考核评语
2014/04/29 职场文书
入党积极分子学习优秀共产党员先进事迹思想汇报
2014/09/13 职场文书
小型婚礼主持词
2015/06/30 职场文书
2015年幼儿教育工作总结
2015/07/24 职场文书