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 20 Python
python查询mysql中文乱码问题
Nov 09 Python
python中defaultdict的用法详解
Jun 07 Python
用tensorflow搭建CNN的方法
Mar 05 Python
python实现Dijkstra静态寻路算法
Jan 17 Python
详解用Python练习画个美队盾牌
Mar 23 Python
python中下标和切片的使用方法解析
Aug 27 Python
python 图像处理画一个正弦函数代码实例
Sep 10 Python
Python2和Python3中@abstractmethod使用方法
Feb 04 Python
Python3运算符常见用法分析
Feb 14 Python
keras小技巧——获取某一个网络层的输出方式
May 23 Python
Python极值整数的边界探讨分析
Sep 15 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开发者事半功倍的十大技巧小结
2010/04/20 PHP
PHP中的MYSQL常用函数(php下操作数据库必备)
2010/09/12 PHP
php页面消耗内存过大的处理办法
2013/03/18 PHP
Zend Framework框架实现类似Google搜索分页效果
2016/11/25 PHP
thinkPHP自动验证机制详解
2016/12/05 PHP
Laravel 中使用简单的方法跟踪用户是否在线(推荐)
2019/10/30 PHP
php实现商城购物车的思路和源码分析
2020/07/23 PHP
JQuery 选择器、过滤器介绍
2011/02/14 Javascript
javascript设计模式 接口介绍
2012/07/24 Javascript
Jquery 选中表格一列并对表格排序实现原理
2012/12/15 Javascript
JQUERY对单选框(radio)操作的小例子
2013/04/25 Javascript
extjs ColumnChart设置不同的颜色实现代码
2013/05/17 Javascript
JQuery对id中含有特殊字符的转义处理示例
2013/09/06 Javascript
通过jquery 获取URL参数并进行转码
2014/08/18 Javascript
基于jQuery实现左右图片轮播(原理通用)
2015/12/24 Javascript
JS实现控制文本框的内容
2016/07/10 Javascript
JS中split()用法(将字符串按指定符号分割成数组)
2016/10/24 Javascript
AngularJS入门教程之MVC架构实例分析
2016/11/01 Javascript
Vue.js实战之使用Vuex + axios发送请求详解
2017/04/04 Javascript
bootstrap modal+gridview实现弹出框效果
2017/08/15 Javascript
完美解决手机网页中输入框被输入法遮挡的问题
2017/12/19 Javascript
解决vue数组中对象属性变化页面不渲染问题
2018/08/09 Javascript
利用Python的Twisted框架实现webshell密码扫描器的教程
2015/04/16 Python
全面解析Python的While循环语句的使用方法
2015/10/13 Python
详解python之多进程和进程池(Processing库)
2017/06/09 Python
python使用tkinter实现简单计算器
2018/01/30 Python
Python中类的创建和实例化操作示例
2019/02/27 Python
python的faker库用法
2019/11/28 Python
Python3 把一个列表按指定数目分成多个列表的方式
2019/12/25 Python
python Plotly绘图工具的简单使用
2020/03/03 Python
python3读取autocad图形文件.py实例
2020/06/05 Python
幼儿园老师辞职信
2014/01/20 职场文书
联谊会主持词
2014/03/26 职场文书
《夜莺的歌声》教学反思
2016/02/22 职场文书
有关保护环境的宣传标语100条
2019/08/07 职场文书
js实现模拟购物商城案例
2021/05/18 Javascript