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 相关文章推荐
有关wxpython pyqt内存占用问题分析
Jun 09 Python
一个小示例告诉你Python语言的优雅之处
Jul 04 Python
在Python的Django框架中用流响应生成CSV文件的教程
May 02 Python
Python学习教程之常用的内置函数大全
Jul 14 Python
一篇文章快速了解Python的GIL
Jan 12 Python
使用Python爬取最好大学网大学排名
Feb 24 Python
解决Python安装后pip不能用的问题
Jun 12 Python
解决Django一个表单对应多个按钮的问题
Jul 18 Python
py-charm延长试用期限实例
Dec 22 Python
学习python需要有编程基础吗
Jun 02 Python
python主要用于哪些方向
Jul 05 Python
解决PyCharm不在run输出运行结果而不是再Console里输出的问题
Sep 21 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/12/25 PHP
THINKPHP内容分页代码分享
2015/01/14 PHP
PHP中遇到的时区问题解决方法
2015/07/23 PHP
新发现一个骗链接的方法(js读取cookies)
2012/01/11 Javascript
JSON取值前判断
2014/12/23 Javascript
jQuery中focus事件用法实例
2014/12/26 Javascript
javascript中callee与caller的区别分析
2015/04/20 Javascript
jquery获取当前元素索引值用法实例
2015/06/10 Javascript
基于javascript实现全国省市二级联动下拉选择菜单
2016/01/28 Javascript
深入浅析Bootstrap列表组组件
2016/05/03 Javascript
Cookies 和 Session的详解及区别
2017/04/21 Javascript
详细分析JS函数去抖和节流
2017/12/05 Javascript
从vue基础开始创建一个简单的增删改查的实例代码(推荐)
2018/02/11 Javascript
element-ui中select组件绑定值改变,触发change事件方法
2018/08/24 Javascript
小程序异步问题之多个网络请求依次执行并依次收集请求结果
2019/05/05 Javascript
解决微信浏览器缓存站点入口文件(IIS部署Vue项目)
2019/06/17 Javascript
Vue编程式跳转的实例代码详解
2019/07/10 Javascript
layui 表格操作列按钮动态显示的实现方法
2019/09/06 Javascript
解决layui调用自定义方法提示未定义的问题
2019/09/14 Javascript
JavaScript获取当前url路径过程解析
2019/12/27 Javascript
零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版
2014/11/06 Python
Python中的MongoDB基本操作:连接、查询实例
2015/02/13 Python
opencv python 2D直方图的示例代码
2018/07/20 Python
Python 打印中文字符的三种方法
2018/08/14 Python
python正则表达式去除两个特殊字符间的内容方法
2018/12/24 Python
Django web框架使用url path name详解
2019/04/29 Python
Python过滤序列元素的方法
2020/07/31 Python
HTML5 与 XHTML2
2008/10/17 HTML / CSS
美体小铺法国官方网站:The Body Shop法国
2020/06/04 全球购物
护士辞职信范文
2014/01/19 职场文书
好人好事事迹材料
2014/02/12 职场文书
人事经理岗位职责
2014/04/28 职场文书
安全教育演讲稿
2014/05/09 职场文书
领导干部查摆“四风”问题自我剖析材料思想汇报
2014/10/05 职场文书
使用python绘制分组对比柱状图
2022/04/21 Python
Java 异步任务计算FutureTask
2022/04/28 Java/Android