29. 类基础-私有属性

本章的主要内容是类的私有属性:变量和函数。

29.1 私有属性

在Python里有类似于C++的私有属性性质。在Python里定义类的私有属性较为简单,在变量名、函数名前加两个下划线即可定义。python默认的成员函数和成员变量都是公开的,没有像其他类似语言的public、private等关键字修饰。

python
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()

程序的执行结果:

shell
  x 12
__y 13
python
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()

程序的执行结果:

shell
  x 12
__y 13
private method of class aa

__q函数是类aa的私有函数,可以在类内部使用,但不能在类之外使用。

python
  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()

程序直接结果:

shell
  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两个。

python
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)

程序执行结果:

shell
  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修饰器来实现点儿语法。

python
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)

程序执行结果:

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

感谢Klang(金浪)智能数据看板klang.org.cn鼎力支持!