Python类的私有数据


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']

    推荐阅读