封装
封装的目的
使类中的属性或者方法只允许在类内部使用,不允许外部对其访问,保证数据的安全性。
封装的方法
使属性或者函数名改写成:“__属性名或者函数名”的格式,即完成了对本类属性或函数名的隐藏。这样,属性或者函数名的真正名称变形为"_类名__属性名或者函数名"。
需注意的地方:
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单独存在。