【代码学习】PYTHON 私有化

一、私有化

xx: 公有变量
_x: 单前置下划线,私有化属性或方法,from somemodule import *禁止导入,类对象和子类可以访问
__xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到)
__xx__:双前后下划线,用户名字空间的魔法对象或属性。例如:__init__ , __ 不要自己发明这样的名字
xx_:单后置下划线,用于避免与Python关键词的冲突

class Test(object):
    def __init__(self):
        self.__num = 100
    def setNum(self,newNum):
        self.__num = newNum
    def getNum(self):
        return self.__num

t = Test()

print t.getNum()
t.setNum(50)
print t.getNum()

当__num设置成私有属性后,Test方法无法直接调用,可定义另一个函数间接调用

以上代码运行结果

>>> 
100
50
>>> 

二、属性property

相当于把方法进行了封装, 开发者在对属性设置数据的时候更方便

取值的时候自己调用值

class Test(object):
    def __init__(self):
        self.__num = 100
    def setNum(self,newNum):
        self.__num = newNum
    def getNum(self):
        return self.__num
    num = property(getNum,setNum)
t = Test()

#注意点:
#t.num 到底是调用getNum()还是setNum(),要根据实际的场景来判断,

t.num = 200     #相当于调用了 t.setNum(200)
print t.num     #相当于调用了 t.getNum() 

另一种使用方法

class Test(object):
    def __init__(self):
        self.__num = 100
    @property
    def num(self):
        print("----getter----")
        return self.__num
    @num.setter
    def num(self,newNum):
        print("----setter----")
        self.__num = newNum


t = Test()

#注意点:
#t.num 到底是调用getNum()还是setNum(),要根据实际的场景来判断

t.num = 200     #相当于调用了 t.setNum(200)
print t.num   #相当于调用了 t.getNum() 

 

posted @ 2017-07-15 15:49  水清云影  阅读(379)  评论(0编辑  收藏  举报