目录
封装是面向对象的三大特性中最核心的一个特性
封装<==>整合
在属性钱加__前缀,就会实现一个对外隐藏熟悉的效果
class Foo:
__x = 10
def __f1(self):
print("我是f1")
虽然在外部我们无法访问类中被隐藏的属性,但是只要只要该属性的名字和类名就可以拼出名字_类.__属性
print(Foo._Foo__x)
>>>10
所以可以理解为这种隐藏只是一种对属性名的变形,并不是完全无法访问。
由上面的实验我们不由的引发一个问题,这种隐藏是在类的哪一个阶段执行的
class Foo:
__x = 10
def __f1(self):
print("我是f1")
def f2(self):
self.__f1()
print(self.__x)
foo_obj = Foo()
foo_obj.f2()
>>>我是f1
>>>10
通过测试我们可以知道在类定义阶段,我们可以用__开头去访问类中的属性,说明这种变形是在类定义阶段就产生的
并且这种隐藏对外不对内
封装给我们带来了两种场景的便利
场景1:我们需要对对象访问某些数据加以严格的条件判断
class People:
def __init__(self, name):
self.__name = name
def get_name(self):
# 通过该接口就可以间接地访问到名字属性
print(self.__name)
def set_name(self,val):
# 通过该接口就可以间接地修改名字属性
if type(val) is not str:
print('小垃圾,必须传字符串类型')
return
self.__name=val
由此,我们在访问People这个类的对象内的属性时候,我们不能直接用对象.的方式去修改name,必须通过我们定义类的时候设定好的接口来实现访问和修改功能。
场景二:隐藏函数/方法属性:目的的是为了隔离复杂度
class ATM:
def __card(self): # 插卡
print('插卡')
def __auth(self): # 身份认证
print('用户认证')
def __input(self): # 输入金额
print('输入取款金额')
def __print_bill(self): # 打印小票
print('打印账单')
def __take_money(self): # 取钱
print('取款')
def withdraw(self): # 取款功能
self.__card()
self.__auth()
self.__input()
self.__print_bill()
self.__take_money()
user_obj = ATM()
user_obj.withdraw()
ATM类有只有一个功能是取款,但是取款又需要分开很多小步骤,这些步骤只要类知道,不需要提供给使用者,这种情况就可以把它隐藏起来
手机扫一扫
移动阅读更方便
你可能感兴趣的文章