主要介绍Python的私有化。
命名规则
xx
公有变量。
_x
单前置下划线,私有化属性或方法。当使用from module import * 导入时,_x变量并不会导入,类对象和子类可以访问。
__xx
双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问。实际上通过namemangling方式可以调用,访问不了是因为名字重整,如\_x会被重整为_className__x, className为类名。
__xx__
双前后下划线,用户名字空间的魔法对象或属性。例如:_init_ , __ 。一般是系统提供的。
xx_
单后置下划线,用于避免与Python关键词的冲突。
私有属性添加getter和setter方法
1 2 3 4 5 6 7 8 9 10 11 12
| class Money(object): def __init__(self): self.__money = 0
def getMoney(self): return self.__money
def setMoney(self, value): if isinstance(value, int): self.__money = value else: print("error:不是整型数字")
|
使用property升级getter和setter方法
1 2 3 4 5 6 7 8 9 10 11 12 13
| class Money(object): def __init__(self): self.__money = 0
def getMoney(self): return self.__money
def setMoney(self, value): if isinstance(value, int): self.__money = value else: print("error:不是整型数字") money = property(getMoney, setMoney)
|
使用property取代getter和setter方法
@property成为属性函数,可以对属性赋值时做必要的检查,并保证代码的清晰短小,主要有2个作用:
1.将方法转换为只读
2.重新实现一个属性的设置和读取方法,可做边界判定
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class Money(object): def __init__(self): self.__money = 0
@property def money(self): return self.__money
@money.setter def money(self, value): if isinstance(value, int): self.__money = value else: print("error:不是整型数字")
|
v1.5.2