封装
封装的目的
使类中的属性或者方法只允许在类内部使用,不允许外部对其访问,保证数据的安全性。
封装的方法
使属性或者函数名改写成:“__属性名或者函数名”的格式,即完成了对本类属性或函数名的隐藏。这样,属性或者函数名的真正名称变形为"_类名__属性名或者函数名"。
需注意的地方:
Python实际上不允许在外部使用“_类名_属性名或者函数名”的格式调用该属性或者方法,正确的调用方法是在类中定义一个调取函数,在外部使用该函数完成对封装属性或者方法的调用。
一个关于封装调用的经典例子:
#在定义阶段就会变形
class A:
def __fa(self): #_A__fa
print('from A')
def test(self):
self.__fa() #self._A__fa() class B(A):
def __fa(self): #_B__fa
print('from B') b=B()
b.test() #b._A__fa()
propery的使用
目的:
使类中的无参函数成为类中的一个属性,节省代码编写。
格式:
class A:
@property#加装饰器的函数必须是无参函数
def foo(self):
print("AAAAA")
a = A()
a.foo#为foo方法加了propery装饰器,在调用该装饰器下面的方法时,不需要加括号。propery.setter的使用
propery.setter的使用
目的:
在默认情况下,propery装饰器下的方法不能带有形参,但现实生活中却需要对该装饰器下面的方法中的属性值进行修改,需要重新赋值操作。
格式:
@被propery装饰器装饰的方法名.setter
示例:
class A:
def __init__(self, name, sex):
self.name = name
self.__sex = sex @property
def sex(self):
return self.__sex @sex.setter
def sex(self, value):
if not isinstance(value,str):
raise TypeError("性别必须是字符串")
self.__sex = value a = A("老王", "男")
print(a.sex)
a.sex = "女"
print(a.sex)
propery.deleter的使用
目的:
删除propery装饰器修饰的方法
示例:
class Foo:
@property
def AAA(self):
print('get的时候运行我啊') @AAA.setter
def AAA(self,value):
print('set的时候运行我啊') @AAA.deleter
def AAA(self):
print('delete的时候运行我啊') #只有在属性AAA定义property后才能定义AAA.setter,AAA.deleter
f1=Foo()
f1.AAA
f1.AAA='aaa'
del f1.AAA
注意:
只有在使用了propery装饰器之后,才能使用“方法名.setter”或者"方法名.deleter",后面的两者均不能脱离propery单独存在。