面向对象2

面向对象
1.封装
封装是面向对象三大特性最核心的一个特性,封装的意思其实就是整合
三大特征:封装,继承,多态
2.将封装的属性进行隐藏操作
如何隐藏:在属性名前加__前缀,就会实现一个对外隐藏属性效果,如下
该隐藏需要注意的问题:1.在类外部无法直接访问双下划线开头的属性,但知道了类名和属性名就可以拼出名字:_类名__属性,然后就可以访问了,如Foo._Foo__A,所以说这种操作并没有严格意义上的限制外部访问,仅仅只是一种语法意义上的'变形'。
class Foo:

__x = 1
def __f1():
pass
这样隐藏的话我们不能直接用Foo.x访问,但是可以通过Foo._Foo__x可以访问到
2.这种隐藏'对外隐藏','不对内隐藏'因为__开头的属性会在检查类体内代码语法的时统一发生变形
对外不对内:在外部访问不到__开头的属性,但是在类内部可以访问到。
变形:本来是__x结果在__dict__里面发现变成了_Foo__x。
class Foo:
__x = 1
def __f2():
print('hello')
def f1():
print(self.__x)
print(self.__f2)
obj = Foo()
obj.f1 # 得到的是1和hello ,这说明了在类内部是可以访问到的
Foo.__x # 报错,这说明在类外部是访问不到的,除非用上面的那种方法
3.这种变形操作只在检查语法的时候发生一次,之后定义的__开头的都不会发生变形
为何要隐藏:数据属性和函数属性隐藏的意义
1.隐藏数据属性
class People:
def __init__(self,name):
self.__name = name
def f1():
# 通过该接口就可以间接地访问到名字属性
print(self.__name)
obj = People('egon')
obj.f1() # 得到的是egon
将数据属性隐藏起来就限制了类外部对数据的直接操作,然后类内应该提供相应的接口来允许类外部间接地操作数据,接口之上可以附加额外的逻辑来对数据的操作进行严格地控制

2.隐藏函数属性
目的的是为了隔离复杂度,例如ATM程序的取款功能,该功能有很多其他功能组成,比如插卡、身份认证、输入金额、打印小票、取钱等,而对使用者来说,只需要开发取款这个功能接口即可,其余功能我们都可以隐藏起来
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()

obj=ATM()
obj.withdraw()

总结隐藏属性与开放接口,本质就是为了明确地区分内外,类内部可以修改封装内的东西而不影响外部调用者的代码;而类外部只需拿到一个接口,只要接口名、参数不变,则无论设计者如何改变内部实现代码,使用者均无需改变代码。这就提供一个良好的合作基础,只要接口这个基础约定不变,则代码的修改不足为虑。

posted @ 2021-07-18 11:35  点滴180  阅读(23)  评论(0编辑  收藏  举报