私有化
Python中属性的分类
在Java中可以通过private关键字定义私有变量,Python中则通过变量名定义的格式来区分变量的访问权限
Python的类中,可以定义5种形式的变量,其功能各不相同,它们的区分依靠变量名的定义格式(Java转过来的表示这个真的很吓到我了)
格式 | 分类 |
---|---|
xx |
公有变量 |
_xx |
私有属性或⽅法 |
__xx |
私有属性或⽅法 |
__xx__ |
魔法对象或属性,写程序时不能定义这种类型的方法或属性 |
xx_ |
普通变量,⽤于避免与Python关键词冲突 |
_xx
和 __xx
的区别
_xx
和 __xx
都是私有方法和属性的定义格式,但是它们有微小的不同,_xx
格式定义的私有方法属性不能通过from somemodule import *
的方法导入模块,但如果使用import somemodule
的方式导入模块,则两者的效果相同
私有属性和方法能够做到使得外部不能访问的原因是Python解释器在私有方法属性定义后对其做了名称重整,就是把他们的名字做了简单的修改使得在外部因为名称不同而无法调用
property关键字的使用
getter,setter方法
对于类中定义的私有变量,一般会定义getter,setter方法,使得在类外可以调用这两个方法访问私有变量
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:不是整型数字")
m = Money
m.setMoney(m,5)
print(m.getMoney(m))
使用property关键字简化getter,setter方法
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语句
money = property(getMoney, setMoney)
m = Money
m.money = 5
print(m.money)
使用property语句后,就不需要调用getter,setter方法即可取值和赋值了,对私有属性的访问就简化了
使用property装饰器
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:不是整型数字")
m = Money
m.money = 5
print(m.money)
使用property装饰器,方法的定义可以简化