Python类的私有数据
- 29. 类基础-私有属性
- 29.1 私有属性
29. 类基础-私有属性 本章的主要内容是类的私有属性:变量和函数。
29.1 私有属性 在Python里有类似于C++的私有属性性质。在Python里定义类的私有属性较为简单,在变量名、函数名前加两个下划线即可定义。python默认的成员函数和成员变量都是公开的,没有像其他类似语言的public、private等关键字修饰。
定义私有变量
class aa(object):
def __init__(self, w, v):
self.x = w
self.__y = v
def p(self):
print "x", self.x
print "__y", self.__y
ai = aa(12, 13)
ai.p()
程序的执行结果:
x 12
__y 13
定义私有函数,不能在类的外部调用。
class aa(object):
def __init__(self, w, v):
self.x = w
self.__y = v
def p(self):
print "x", self.x
print "__y", self.__y
self.__q()
def __q(self):
print "private method of class aa"
ai = aa(12, 13)
ai.p()
#aa.__q()
#ai.__q()
#ai._aa__q()
程序的执行结果:
x 12
__y 13
private method of class aa
__q
函数是类aa的私有函数,可以在类内部使用,但不能在类之外使用。property修饰器,对于aa类里的x成员是可以通过点儿语法直接访问读写的。而__y属性由于是私有的数据成员,是无法在类外部直接读写,可以通过设计读写__y的函数来操作直接读写。也可以通过设置property来实现。
class aa(object):
def __init__(self, w, v):
self.x = w
self.__y = v
def p(self):
print "x", self.x
print "__y", self.__y
self.__q()
def __q(self):
print "private method of class aa"
ai = aa(12, 13)
ai.p()
#aa.__q()
#ai.__q()
#ai._aa__q()
ai.x = 102
ai.p()
ai.__y = 103
print dir(ai)
ai.p()
程序直接结果:
x 12
__y 13
private method of class aa
x 102
__y 13
private method of class aa
['__class__',..., '__weakref__', '__y', '_aa__q', '_aa__y', 'p', 'x']
x 102
__y 13
private method of class aa
请注意
print dir(ai)
的输出结果里有__y
和_aa__y
两个。class aa(object):
def __init__(self, w, v):
self.x = w
self.__y = v
def p(self):
print "x", self.x
print "__y", self.__y
self.__q()
def __q(self):
print "private method of class aa"
def sety(self, v):
self.__y = v
def gety(self):
return self.__y
ai = aa(12, 13)
ai.p()
#aa.__q()
#ai.__q()
#ai._aa__q()
ai.x = 102
ai.p()
ai.__y = 103
print dir(ai)
ai.p()
ai.sety(104)
ai.p()
print dir(ai)
程序执行结果:
x 12
__y 13
private method of class aa
x 102
__y 13
private method of class aa
['__class__',... '__weakref__', '__y', '_aa__q', '_aa__y', 'gety', 'p', 'sety', 'x']
x 102
__y 13
private method of class aa
x 102
__y 104
private method of class aa
['__class__',..., '__weakref__', '__y', '_aa__q', '_aa__y', 'gety', 'p', 'sety', 'x']
设计了函数sety和gety但是点儿语法还是不能直接影响定义在类aa里的私有变量__y,显然方法不行,可以使用Python的property修饰器来实现点儿语法。
class aa(object):
def __init__(self, w, v):
self.x = w
self.__y = v
def p(self):
print "x", self.x
print "__y", self.__y
self.__q()
def __q(self):
print "private method of class aa"
def sety(self, v):
self.__y = v
def gety(self):
return self.__y
@property
def y(self):
return self.__y
@y.setter
def y(self, v):
self.__y = v
ai = aa(12, 13)
ai.p()
#aa.__q()
#ai.__q()
#ai._aa__q()
ai.x = 102
ai.p()
ai.__y = 103
print dir(ai)
ai.p()
ai.sety(104)
ai.p()
print dir(ai)
print "*" * 20
ai.y = 200
ai.p()
print dir(ai)
【Python类的私有数据】程序执行结果:
x 12
__y 13
private method of class aa
x 102
__y 13
private method of class aa
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '__y', '_aa__q', '_aa__y', 'gety', 'p', 'sety', 'x', 'y']
x 102
__y 13
private method of class aa
x 102
__y 104
private method of class aa
['__class__', ... , '__weakref__', '__y', '_aa__q', '_aa__y', 'gety', 'p', 'sety', 'x', 'y']
********************
x 102
__y 200
private method of class aa
['__class__', ... , '__weakref__', '__y', '_aa__q', '_aa__y', 'gety', 'p', 'sety', 'x', 'y']
推荐阅读
- 推荐系统论文进阶|CTR预估 论文精读(十一)--Deep Interest Evolution Network(DIEN)
- Python专栏|数据分析的常规流程
- Python|Win10下 Python开发环境搭建(PyCharm + Anaconda) && 环境变量配置 && 常用工具安装配置
- Python绘制小红花
- Pytorch学习|sklearn-SVM 模型保存、交叉验证与网格搜索
- OpenCV|OpenCV-Python实战(18)——深度学习简介与入门示例
- python|8. 文件系统——文件的删除、移动、复制过程以及链接文件
- 爬虫|若想拿下爬虫大单,怎能不会逆向爬虫,价值过万的逆向爬虫教程限时分享
- 分布式|《Python3网络爬虫开发实战(第二版)》内容介绍
- java|微软认真聆听了开源 .NET 开发社区的炮轰( 通过CLI 支持 Hot Reload 功能)