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基于twisted实现简单的web服务器
Sep 29 Python
在Python中编写数据库模块的教程
Apr 29 Python
关于Python中浮点数精度处理的技巧总结
Aug 10 Python
基于Python闭包及其作用域详解
Aug 28 Python
python和flask中返回JSON数据的方法
Mar 26 Python
python与caffe改变通道顺序的方法
Aug 04 Python
python去掉 unicode 字符串前面的u方法
Oct 21 Python
Python 实现数据结构中的的栈队列
May 16 Python
python 图片二值化处理(处理后为纯黑白的图片)
Nov 01 Python
wxPython绘图模块wxPyPlot实现数据可视化
Nov 19 Python
python实现FTP循环上传文件
Mar 20 Python
利用Python中的Xpath实现一个在线汇率转换器
Sep 09 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 printf输出格式使用说明
2010/12/05 PHP
php文件上传的简单实例
2013/10/19 PHP
php实现parent调用父类的构造方法与被覆写的方法
2015/02/11 PHP
php插入含有特殊符号数据的处理方法
2016/11/24 PHP
javascript 手动给表增加数据的小例子
2013/07/10 Javascript
JavaScript中统计Textarea字数并提示还能输入的字符
2014/06/10 Javascript
javascript面向对象之共享成员属性与方法及prototype关键字用法
2015/01/13 Javascript
js+jquery常用知识点汇总
2015/03/03 Javascript
BootStrap中Tab页签切换实例代码
2016/05/30 Javascript
JS之获取样式的简单实现方法(推荐)
2016/09/13 Javascript
基于bootstrap按钮式下拉菜单组件的搜索建议插件
2017/03/25 Javascript
jquery实现tab键进行选择后enter键触发click行为
2017/03/29 jQuery
JS中的数组转变成JSON格式字符串的方法
2017/05/09 Javascript
vue页面使用阿里oss上传功能的实例(一)
2017/08/09 Javascript
vue2+el-menu实现路由跳转及当前项的设置方法实例
2017/11/07 Javascript
原生JS实现的雪花飘落动画效果
2018/05/03 Javascript
javascript中call()、apply()的区别
2019/03/21 Javascript
利用JS响应式修改vue实现页面的input值
2019/09/02 Javascript
React Native 混合开发多入口加载方式详解
2019/09/23 Javascript
javascript实现简单打字游戏
2019/10/29 Javascript
Vue数字输入框组件示例代码详解
2020/01/15 Javascript
使用Python编写一个最基础的代码解释器的要点解析
2016/07/12 Python
Python使用Windows API创建窗口示例【基于win32gui模块】
2018/05/09 Python
用Python写一个模拟qq聊天小程序的代码实例
2019/03/06 Python
利用python实现汉字转拼音的2种方法
2019/08/12 Python
基于pytorch的保存和加载模型参数的方法
2019/08/17 Python
python将字符串转变成dict格式的实现
2019/11/18 Python
Python如何使用ElementTree解析xml
2020/10/12 Python
scrapy redis配置文件setting参数详解
2020/11/18 Python
浅谈Html5多线程开发之WebWorkers
2018/05/02 HTML / CSS
售后服务经理岗位职责范本
2014/02/22 职场文书
软件研发工程师岗位职责
2014/09/30 职场文书
学院党的群众路线教育实践活动整改方案
2014/10/04 职场文书
购房个人委托书范本
2014/10/11 职场文书
Python实现批量自动整理文件
2022/03/16 Python
Alexa停服!网站排名将何去何从?目前还没有替代品。
2022/04/15 杂记