python面向对象进阶-09接口和抽象类
接口
接口是一组功能的集合,但是接口中仅包含功能的名字,不包含具体的实现代码
接口本质是一套协议标准,遵循这个标准的对象就能被调用
接口目的:
为了提高扩展性
例如电脑提前指定制定一套USB接口协议,只要你遵循该协议,你的设备就可以被电脑使用,不需要关心到底是鼠标还是键盘
封装描述了对数据/信息进行隐藏的观念,它对数据属性提供接口和访问函数。通过任何客户端直接对数据的访问,无视接口,与封装性都是背道而驰的,除非程序员允许这些操作。作为实现的 一部分,客户端根本就不需要知道在封装之后,数据属性是如何组织的。在Python中,所有的类属性都是公开的,但名字可能被“混淆”了,以阻止未经授权的访问,但仅此而已,再没有其他预防措施了。这就需要在设计时,对数据提供相应的接口,以免客户程序通过不规范的操作来存取封装的数据属性。
注意:封装绝不是等于“把不想让别人看到、以后可能修改的东西用private隐藏起来”
真正的封装是,经过深入的思考,做出良好的抽象,给出“完整且最小”的接口,并使得内部细节可以对外透明
(注意:对外透明的意思是,外部调用者可以顺利的得到自己想要的任何功能,完全意识不到内部细节的存在)
上代码
class USB:
def open(self):
pass
def close(self):
pass
def read(self):
pass
def write(self):
pass
class Mouse(USB):
def open(self):
print("鼠标开机.....")
def close(self):
print("鼠标关机了...")
def read(self):
print("获取了光标位置....")
def write(self):
print("鼠标不支持写入....")
def pc(usb_device):
usb_device.open()
usb_device.read()
usb_device.write()
usb_device.close()
m = Mouse()
# 将鼠标传给电脑
pc(m)
class KeyBoard(USB):
def open(self):
print("键盘开机.....")
def close(self):
print("键盘关机了...")
def read(self):
print("获取了按键字符....")
def write(self):
print("可以写入灯光颜色....")
# 来了一个键盘对象
k = KeyBoard()
pc(k)
在上述案例中,PC的代码一旦完成,后期无论什么样的设备 只要遵循了USB接口协议,都能够被电脑所调用
接口主要是方便了对象的使用者,降低使用者的 学习难度,只要学习一套使用方法,就可以以不变应万变
问题:
如果子类没有按照你的协议来设计,也没办法限制他,将导致代码无法运行
就可以用到定义抽象类的方法来实现对子类的方法的限定!!!!!!!
抽象类
什么是抽象类
指的是包含抽象方法(没有函数体的方法)的类
抽象类作用
可以限制子类必须类中定义的抽象方法
代码走你
class Mouse:
def open(self):
print("鼠标开机.....")
def close(self):
print("鼠标关机了...")
def read(self):
print("获取了光标位置....")
def write(self):
print("鼠标不支持写入....")
def pc(usb_device):
usb_device.open()
usb_device.read()
usb_device.write()
usb_device.close()
m = Mouse()
# 将鼠标传给电脑
pc(m)
class KeyBoard:
def open(self):
print("键盘开机.....")
def close(self):
print("键盘关机了...")
def read(self):
print("获取了按键字符....")
def write(self):
print("可以写入灯光颜色....")
# 来了一个键盘对象
k = KeyBoard()
pc(k)
class UDisk:
def open(self):
print("U盘启动了...")
def close(self):
print("U盘关闭了...")
def read(self):
print("读出数据")
def write(self):
print("写入数据")
u = UDisk()
pc(u)
接口是一套协议规范,明确子类们应该具备哪些功能
抽象类是用于强制要求子类必须按照协议中规定的来实现
然而,python不推崇限制你的语法, 我们可以设计成鸭子类型,既让多个不同类对象具备相同的属性和方法
对于使用者而言,就可以以不变应万变,轻松的使用各种对象
鸭子类型
python一般不会限制你必须怎么写,作为一个优秀的程序员,就应该自觉遵守相关协议
所以有了鸭子类型这么一说:
如果这个对象长得像鸭子,走路像鸭子,那就他是鸭子
你只要保证你的类按照相关的协议类编写,也可以达到提高扩展性的目的