多继承 , 组合 , 菱形继承 , 接口 , 抽象 , 鸭子类型
一, 复习
属性的的正确存放位置:类中应该存储所有对象公共的内容对象中存储都是每个对象独有的(都不同) 初始化函数:给对象的属性赋初值 , 可以保证只要对象被创建就一定有相应的属性节省了重复代码绑定方法:指的是 将类或对象与函数进行了绑定之所以绑定是为了提高整合度,后续在拿到对象就可以直接调用而无需关心 数据是什么 如何处理对象也可以看做是一个存储数据的容器对象绑定方法:默认情况下就是绑定给对象的当执行该方法时,需要访问对象中的内容当使用对象调用时 会自动传入对象本身作为第一个参数用类来调用时就是一个普通函数 该怎么传就这么传类绑定方法:当执行该方法时,需要访问类中的内容而不需要对象中的内容@classmethod无论使用类还是对象来调用都会自动传入类本身作为第一个参数非绑定方法既不需要访问类中的内容 也不需要访问对象中的内容 那就作为非绑定方法 就是一个普通函数 没有自动传值的效果@staticmethod继承说的是类与类之间的关系存在基础关系后 子类可以直接使用父类已经存在的内容 总的来说是为了提高代码的复用性例如猫 和狗 都属于动物类描述的时 什么是什么的关系 如:猫是动物要开始累积自己的类库 把经常使用的小功能写到一个模块中 以后可以直接调用class 子类(父类):pass属性查找顺序对象本身 -> 所在的类 -> 类的父类 -> .... object抽象使用基础时 应该先抽象 在继承抽象指的是 把一系列类中的相同的特征和行为抽取 形成一个新的类 (公共父类)派生子类拥有与父类不同的内容 覆盖子类出现了与父类完全相同的名字一切皆对象在py3里面所有东西全是对象 包括 int list 模块 函数 .....包等等....list.append(li,1)子类访问父类的内容1.指名道姓 直接写死了类名 即时不存在继承关系也能调用2.super().要访问的属性 (py3出现的)3.super(这个子类的名字,self).属性
二 , 继承已有的类来扩展新功能
#实现一个存储类,在提供基本的存取功能之外,还要可以限制存储元素的类型 class MyList(list):def __init__(self,element_cls):#当你覆盖了init时,不要忘记调用super().init函数让父类完成原有的初始化操作super().__init__()self.element_cls = element_clsdef append(self,object):if object.__class__ == self.element_cls: #如果传进来的数据与我限制的的类型匹配上,则添加到列表 super().append(object)else:print('只能存储%s类型!'%self.element_cls.__name__)li = MyList(str) li.append(10) #只能存储str类型! li.append('123') print(li) #['123']
三 , 多继承问题
class A:def test(self):print('from A')super().test() #应该报错,但是执行成功了class B:def test(self):print('from B')class C(A,B):passc = C() c.test() # from A # from Bprint(C.mro()) #[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]#问题:多继承时如果多个父类中出现了同名的属性/函数 #你不能用眼睛去判断查找顺序,需要使用mro列表去查看真正的继承顺序 #总结:super在访问父类属性时,是按照mro列表一层层往上找的class A:a = 1passclass B(A):a = 2passclass C(A):a = 3passclass D(A):a = 4passclass E(B,C,D):a = 5passaa = E() print(aa.a) print(E.mro()) #[<class '__main__.E'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class '__main__.A'>, <class 'object'>]
四 , 组合
''' 组合:指的是一个类把另一个类作为自己的属性来使用,就称之为组合当你定义一个类,并且这个类拥有某种类型的属性时,就称之为组合组合描述的是:什么拥有什么的关系, 学生有书 学生有手机 继承描述的是:什么是什么的关系 麦兜是猪 猪猪侠也是猪 '''''class PC:def open_app(self,app_name):print('open %s'% app_name)class Student:def __init__(self,PC,notbook):self.PC = PCself.notbook = notbookpc = PC() notbook = PC()s = Student(pc,notbook) s.PC.open_app('qq') s.notbook.open_app('what') # s.PC.open_app('ch')
五 , 菱形继承
# 在py2中 A就是一个经典类 # class A: # pass# 如果你的代码需要兼容py2 那应该显式的继承object 无论是直接还是间接继承 class B(object):passclass A(B):pass
六 , 接口
''' 接口:就是一套协议规范 具体表现形式:有一堆函数,但是只明确了函数的名称,没有明确函数的具体表现 '''''import abcclass USB(metaclass=abc.ABCMeta):@abc.abstractmethoddef open(self):pass@abc.abstractmethoddef work(self):pass@abc.abstractmethoddef close(self):passclass Mouse(USB):#实现接口规定的所有功能def open(self):print('mouse open')def work(self):print('mouse word')def close(self):print('mouse close')class KeyBord:def open(self):print('KeyBoard open')def work(self):print("KeyBoard working...")def close(self):print("KeyBoard closed")#问题是无法限制子类,必须真正的实现接口中的功能 class Camera(USB):def open(self):passdef work(self):passdef close(self):passclass PC:def device(self,usb_device):usb_device.open()usb_device.work()usb_device.close()#在实例化Camera abc模块就会检查Camera是否实现了所有的抽象方法,如果没有则无法实例化 c = Camera()p = PC()#创建一个鼠标设备 m = Mouse()#创建一个键盘设备 key1 = KeyBord()#链接到电脑上 p.device(m) p.device(key1) p.device(c)
七 , 抽象
''' 抽象类:具备抽象方法的类 抽象方法是,没有函数体的方法 抽象类的特点:不能直接实例化 '''''import abc class Test(metaclass=abc.ABCMeta):@abc.abstractmethoddef say_hi(self):pass#可以有普通函数def info(self):print('my class is Test')class TT(Test):def say_hi(self):print('i an TT obj')# pass t = TT() t.info() t.say_hi()
八 , 鸭子类型
class PC():def conntent_device(self, usb_device):usb_device.open()usb_device.work()usb_device.close()class Mouse:# 实现接口规定的所有功能def open(self):print("mouse opened")def work(self):print("mouse working...")def close(self):print("mouse closed")mouse = Mouse() pc = PC()pc.conntent_device(mouse)class KeyBoard:def open(self):print("KeyBoard opened")def work(self):print("KeyBoard working...")def close(self):print("KeyBoard closed")key1 = KeyBoard()# 如果key1的特征和行为都像USB设备 那就把它当做USB设备来使用 # 对于使用者而言可以不用关心这个对象是什么类,是如如何是实现, pc.conntent_device(key1)
class Linux:def read_data(self,device):data = device.read()return datadef write_data(self,device,data):device.write(data)class Disk:def read(self):print("disk reading....")return "这是一个磁盘上的数据"def write(self,data):print("disk writing %s..." % data)class UP:def read(self):print("disk reading....")return "这是一个U盘上的数据"def write(self,data):print("disk writing %s..." % data)l = Linux()d = Disk() data = l.read_data(d) l.write_data(d,"这是一个数据....")up1 = UP() l.read_data(up1) l.write_data(up1,"一个数据...")
转载于:https://www.cnblogs.com/HZLS/p/10895830.html
多继承 , 组合 , 菱形继承 , 接口 , 抽象 , 鸭子类型相关推荐
- C++继承机制(三)——多继承、菱形继承、虚继承原理
目录: C++继承机制(一)--基本语法.三种继承方式.继承哪些数据 C++继承机制(二)--继承中的构造和析构顺序.继承同名成员的处理方式 C++继承机制(三)--多继承.菱形继承.虚继承原理 本篇 ...
- C++:94---类继承(菱形继承、虚继承(virtual虚基类))
一.菱形继承 在介绍虚继承之前介绍一下菱形继承 概念:A作为基类,B和C都继承与A.最后一个类D又继承于B和C,这样形式的继承称为菱形继承 菱形继承的缺点: 数据冗余:在D中会保存两份A的内容 访问不 ...
- 初始Java Java SE 包,继承,组合,多态,抽象类,接口
目录 包 1.静态导入 2.将类放到包中 3.包的访问权限控制 继承 基本语法: 注意事项: protected 关键字 final 关键字 组合 多态 向上转型: 动态绑定 方法重写 重写的规则 : ...
- 类的继承,派生,组合,菱形继承,多态与多态性
类的继承 继承是一种新建类的方式,新建的类称为子类,被继承的类称为父类 继承的特性是:子类会遗传父类的属性 继承是类与类之间的关系 为什么用继承 使用继承可以减少代码的冗余 对象的继承 python中 ...
- 8-5:C++继承之多继承,菱形继承,虚继承,虚基表,继承和组合
文章目录 一:菱形继承与菱形虚拟继承 (1)多继承 (2)菱形继承 (3)虚继承 A:如何解决 B:解决原理 二:继承总结 (1)继承缺陷 (2)继承与组合 一:菱形继承与菱形虚拟继承 (1)多继承 ...
- 6-C++中继承的权限有三种情况、创建和销毁的执行过程、多继承、菱形继承、多态的相关知识点
目录 1.继承的权限有三种 (1)public继承 (2)protected继承 (3)private继承 总结 2.创建和销毁的执行过程 (1)类中有成员对象情况 (2)继承时情况 (3)创建和销毁 ...
- 内存首地址为1000h_C++虚继承,菱形继承,内存分布
前言 在叙述C++虚继承之前,我先给大家抛出一个问题.例如现在有4个类,分别是class A, class B, class C, class D.它们的关系如下图. 如上如所示,class B和cl ...
- C++_类和对象_C++继承_菱形继承_或钻石继承_问题及利用虚继承解决该问题---C++语言工作笔记068
然后我们再来看一下在c++继承中的,一个很好玩的内容, 菱形继承,又叫 钻石继承. 比如我们有个动物类,然后 羊继承了这个动物类,然后驼也继承了这个动物类, 然后,羊驼,通过多继承,继承了羊类和驼类, ...
- C++继承以及菱形继承
C++面向对象--继承 问题的引出 假如我们需要给某个高校制作一款人员信息管理系统,学习过C++之后我们知道可以给每个职业设置一个class,到每个个体的时候再具体实例化出一个对象就行了,假如该高校的 ...
最新文章
- 重做日志文件(redo log file)和归档日志文件(archive log file)
- 【分组并查集讲解】A Bug‘s Life(例题)
- Windows进程与线程学习笔记(三)—— KPCR
- 华硕服务器显示模块,华硕远程管理模块 ASMB4-iKVM 华硕服务器主板专用 现货 IPMI...
- jquery validate 表单验证
- Java-基础类库第一篇认识基础类库
- 相关性分析:Pearson、Kendall、Spearman
- LSTM长短期记忆网络对车辆尾气排放进行预测
- Java面向对象设计
- 盛大开业!三星生活家电体验馆正式入驻红星美凯龙
- 操作系统笔记(1.5w字耐心整理)
- java计算工作日_Java工作日计算工具类
- 亚马逊Alexa的深度学习与语音识别的核心技术原理
- 本科毕业设计(论文)外文翻译基本规范
- HTML:常见的标签 实体 图片标签
- python抖音github_利用python 下载抖音上流行音乐
- 清华大学公开课线性代数2——第6讲:伪逆
- 传感器技术实验及实训QY-812G
- win10“此电脑”下的几个文件夹怎删除?
- 西门子PLC伺服大型20轴程序modbus通讯RS232通讯MES通讯气缸,通讯,机械手,模拟量等,各种FB块
热门文章
- 看见的力量 – (II) 影响地图
- 弹窗样式 idialog,purebox,artdialog4.1.2,jquery.alert.v1.2
- 【转】VC 多线程中控制界面控件的几种方法
- Codeforces Round #248 (Div. 2) B. Kuriyama Mirai's Stones
- 80386的内存分页机制
- ie下的firebug
- 软件工程团队项目方案(四):高校申请指南
- 实例协议分析RFC1483:AAL5和几种常见ADSL接入技术
- Android presentation
- Android资料之-EditText中的inputType