主要介绍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:不是整型数字")