一、封装方法
- 如何封装方法:给方法名字前面加上双下划线
- 封装方法的好处:
- 提高安全性
- 隔离复杂度(将复杂的内容隔离到内部,外部只留下简单的接口,对于使用者而言,降低难度)
class A:
def __f1(self):
print("f1 run")
def run_f1(self):
self.__f1()
a = A()
a.run_f1()
# ATM的取款功能
#1.插入银行卡 2.输入密码 3.选择取款金额 4.取款
class ATM:
def __insert_card(self):
print("插入银行卡...")
def __input_pwd(self):
print("输入密码...")
def __select_money(self):
print("选择取款金额...")
def withdraw(self):
self.__insert_card()
self.__input_pwd()
self.__select_money()
print("取款成功!....")
atm = ATM()
#外部调用这个简单的接口,就能完成一系列复杂的操作
atm.withdraw()
二、封装的实现原理
class Person:
def __init__(self,name,sex,age,idCard):
self.name = name
self.sex = sex
self.__age = age
self.__idCard = idCard
def get_idCard(self):
return self.__idCard
def __test(self):
pass
print("aaaaaaaaaa")
p = Person("比尔盖茨","男",20,"322323232332332")
p.__idCard = 'xxxxxxx'
print(p.get_idCard())
print(p.__dict__) #{'name': '比尔盖茨', 'sex': '男', '_Person__age': 20, '_Person__idCard': '322323232332332', '__idCard': 'xxxxxxx'}
print(Person.__dict__)
p.__xxxxxxxxxxxx = 1
print(p.__dict__) #{'name': '比尔盖茨', 'sex': '男', '_Person__age': 20, '_Person__idCard': '322323232332332', '__idCard': 'xxxxxxx', '__xxxxxxxxxxxx': 1}
#通过__dict__ 可以发现
#1.私有的属性和方法名称前自动加上了_类名,python就是通过这样的转换方式来实现封装
#2.只有在类的内部的双下划线才会被自动转换,并且这个转换过程只执行一次
#3.父类中私有的方法,子类中无法使用
子类无法覆盖父类的私有方法:
class A:
def f(self):
self.__f1() #_A__f1
def __f1(self):
print("A __f1")
class B(A):
def __f1(self): # _B__f1
print("B __f1")
def f2(self):
self.f()
b = B()
b.f2()
#之所以无法覆盖是因为子类和父类中的私有方法名称不相同,所以无法覆盖,子类的方法一定子类独有的,因为名称不同
三、property装饰器
-
当一些属性的值,不是固定的而是通过计算得来的时候,我们必须为这个属性增加方法才能完成计算。但是一旦使用方法后,该属性的访问就变成了方法的调用,很明显与其他的属性访问方式不同,这样给使用者造成迷惑
-
property可以将方法伪装成属性,利用这个特点我们也可以将其使用到封装中,之前没有这个装饰器我们需要为私有的属性 提供两个方法,但是这样一来方访问私有属性时的方式就发生了变化
这时候就可以使用property来进行伪装,使得访问私有属性与访问普通属性的方式一致
-
另外property还提供了setter(用于修改属性的值)和deleter(删除属性的值)
BIM案例:
class Person:
def __init__