一、私有化
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()