python类私有函数_Python类的私有数据

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)

程序执行结果:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值