封装,接口,抽象
- 封装
- 定义
就是将复杂的丑陋的,隐私的细节隐藏到内部,其他程序无法调用,使私有化,
但是可以在内部定义方法,外部调用这个方法的方式来使用被封装的方法和属性 - 好处
1.为了保证 关键数据的安全性
2.对外部隐藏实现细节,隔离复杂度 - 语法
在属性名前添加两个下划线__,将其设置为私有的即可 - 原理
1.其实这仅仅这是一种变形操作且仅仅只在类定义阶段发生变形
(就是说通过__dict__方法查看显示的还是__属性名,并不是_类名__属性名);
2.类中所有双下划线开头的名称如__x都会在类定义时自动变形成:_类名__x的形式,并没有真正阻止外部的访问
3.在继承中,父类如果不想让子类覆盖自己的方法,可以将方法定义为私有的 - 权限问题
在python只要两种权限:
1.公开的.默认就是公开的
2.私有的,只能由当前类自己使用
- 定义
- 访问私有属性的方法(property装饰器)
- 如何理解
其实就是通过property的get,set,delete实现了:
将对象名.方法(参数) 改为了对象名.属性名 = 参数的形式 - 相关的三个装饰器
1.property 该装器用在获取属性的方法上
2.@key.setter 该装器用在修改属性的方法上
3.@key.deleter 该装器用在删除属性的方法上
注意:key是被property装饰的方法的名称 也就是属性的名称 内部会创建一个对象,变量名称就是函数名称
所以在使用setter和deleter时 必须保证使用对象的名称取调用方法 所以是 key.setter - 案例
# property装饰器案例 class A: def __init__(self,name,key): self.__name = name self.__key = key @property def key(self): return self.__key @key.setter def key(self,new_key): if new_key <= 100: self.__key = new_key else: print("key 必须小于等于100") @key.deleter def key(self): print("不允许删除该属性") del self.__key a = A("jack",123) print(a.key) a.key = 321 print(a.key)
- 如何理解
- 计算属性
- 如何理解
就是property方法的一个应用 - 案例
# 计算属性案例 class Square: def __init__(self,width): self.width = width # self.area = self.width * self.width @property def area(self): return self.width * self.width s = Square(10) print(s.area) '''执行结果 100 '''
- 如何理解
- 接口
- 定义
继承的一种特殊情况
接口是一组功能的集合,但是接口中仅包含功能的名字,不包含具体的实现代码
接口是一套协议规范,明确子类们应该具备哪些功能接口本质是一套协议标准,遵循这个标准的对象就能被调用 - 目的
提高扩展性例如 电脑提前指定制定一套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) '''执行结果 鼠标开机..... 获取了光标位置.... 鼠标不支持写入.... 鼠标关机了... '''
- 案例理解
PC的代码一旦完成,后期无论什么样的设备,只要遵循了USB接口协议,都能够被电脑所调用
接口主要是方便了对象的使用者,降低使用者的 学习难度,只要学习一套使用方法,就可以以不变应万变
- 定义
- 抽象类
- 定义
指的是包含抽象方法(没有函数体的方法)的类;
抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化,且有存在没有实现的方法; - 作用
可以限制子类必须类中定义的抽象方法 - 抽象和接口的异同
抽象类 中既可以包含抽象方法也可以包含普通方法和属性!接口 仅仅是协议,所以接口中不应该包含任何具体的实现代码! - 案例
""" abc 不是随意取的 而是单词的缩写 abstract class 翻译为抽象类 抽象类的定义 : 类中包含 没有函数体的方法 """ import abc class AClass(metaclass=abc.ABCMeta): @abc.abstractmethod def run(self): pass @abc.abstractmethod def run1(self): pass class B(AClass): def run(self): print("runrunrurn...") b = B()
- 定义
- 鸭子类型
- 定义
抽象类是用于强制要求子类必须按照协议中规定的来实现
然而,python不推崇限制你的语法, 我们可以设计成鸭子类型,既让多个不同类对象具备相同的属性和方法 - 好处
对于使用者而言,就可以以不变应万变,轻松的使用各种对象
- 定义