python 继承进阶
继承进阶
面向对象
1.类:具有相同属性和方法 的一类事物
类名可以实例化一个对象
类名可以调用类属性,(静态属性 和(方法)动态属性)
2.对象:也就是实例
对象名:调用对象属性
调用方法
3.什么叫抽象?
从小到大的过程
4.组合-----什么有什么的关系(将一个类的对象当做另一个类的属性)
5.继承-----什么是什么的关系
从大范围到小范围的过程
继承的作用:减少代码的重用性
子类有的方法,就用子类的。不会调用父类的方法。
如果要在子类中调用父类的方法:super().类名()
6.派生:父类没有的子类有了
派生类:在父类的基础上,又产生了子类,这个子类就叫做派生类
派生属性:父类里没有的属性但子类中有了的属性就叫做派生方法。
派生方法:父类里没有的方法但子类中有了的方法就叫做派生方法。
7.方法的重写
父类里有子类里也有的方法叫做方法的重写
二、接口类与抽象类
1.接口类:(在抽象类的基础上)
在python中,默认是没有接口类的
接口类不能被实例化(如果实例化会报错)
接口类中的方法不能被实现
1 1.正常调用
2 class Applepay:
3 def pay(self,money):
4 print('apple pay 支付了%s' %money)
5
6 class Alipay:
7 def pay(self,money):
8 print('支付宝 支付了%s' %money)
9
10 def payment(pay_obj,money): #实例化的另一种调用,这个方法让实例化的时候按照payment调用:就像下面的payment(apple1,200)
11 pay_obj.pay(money)
12
13 apple1 = Applepay()
14 # apple1.pay(200)
15 payment(apple1,200)
正常实现调用
1 # 2.有时候写的时候会把方法写错,自己定义一个主动报错
2 # 接口初成:手动报异常:NotImplementedError来解决开发中遇到的问题
3 class Payment:
4 def pay(self):
5 raise NotImplementedError #主动让程序报错
6
7 class Wechatpay(Payment): #微信支付
8 def pay(self,money):
9 print('微信支付了%s元',money)
10
11 class QQchatpay(Payment): #QQ支付
12 def fuqian(self,money):
13 print('QQ支付了%s元',money)
14
15 p = Wechatpay()
16 p.pay(200) #不报错
17 q = QQchatpay() #不报错
18 q.pay() #报错
手动报错
1 # 3.借用abc模块来实现接口
2 #接口类(就是为了提供标准,约束后面的子类)
3 from abc import ABCMeta,abstractmethod
4 class Payment(metaclass=ABCMeta):
5 @abstractmethod
6 def pay(self,money):
7 pass
8
9 class Wechatpay(Payment):
10 def fuqian(self,money):
11 '''实现了pay的功能,但是方法名字不一样'''
12 print('微信支付了%s元'%money)
13
14 class Alipay:
15 def pay(self,money):
16 print('支付宝 支付了%s' %money)
17
18 # p = Wechatpay() #报错了(因为上面定义了一个接口类,接口类里面
19 # 定义了一个pay方法,而在下面的Wechatpay方法里没有pay方法,不能
20 # 调用,在接口类里面约束一下,接口类里的pay方法里面不能写其他,直接pass)
21 a = Alipay()
22 a.pay(200)
23 p = Payment() #接口类不能被实例化
借用abc模块来实现接口
1 接口提取了一群类共同的函数,可以把接口当做一个函数的集合。
2
3 然后让子类去实现接口中的函数。
4
5 这么做的意义在于归一化,什么叫归一化,就是只要是基于同一个接口实现的类,那么所有的这些类产生的对象在使用时,从用法上来说都一样。
6
7 归一化,让使用者无需关心对象的类是什么,只需要的知道这些对象都具备某些功能就可以了,这极大地降低了使用者的使用难度。
8
9 比如:我们定义一个动物接口,接口里定义了有跑、吃、呼吸等接口函数,这样老鼠的类去实现了该接口,松鼠的类也去实现了该接口,由二者分别产生一只老鼠和一只松鼠送到你面前,即便是你分别不到底哪只是什么鼠你肯定知道他俩都会跑,都会吃,都能呼吸。
10
11 再比如:我们有一个汽车接口,里面定义了汽车所有的功能,然后由本田汽车的类,奥迪汽车的类,大众汽车的类,他们都实现了汽车接口,这样就好办了,大家只需要学会了怎么开汽车,那么无论是本田,还是奥迪,还是大众我们都会开了,开的时候根本无需关心我开的是哪一类车,操作手法(函数调用)都一样
12
13 为何要用接口
为何要用接口
接口也就是做约束,让下面的类的方法都按照接口类中给出的方法去定义。如果接口类里面有的方法类里面没有,那么那个类就不能被实例化。(字面理解)
继承的第二种含义非常重要。它又叫“接口继承”。
接口继承实质上是要求“做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理实现了特定接口的所有对象”——这在程序设计上,叫做归一化。
2.抽象类:
在python中,默认是有的
父类的方法,子类必须实现
抽象类(父类)的方法可以被实现
1 # 抽象类
2 # 什么叫做抽象? 从小范围到大范围
3 from abc import ABCMeta,abstractmethod
4 class Animal(metaclass=ABCMeta):
5 @abstractmethod
6 def eat(self):
7 print('打开粮食的袋子')
8 print('放一个吃饭的碗')
9 print('吧粮食倒在碗里')
10
11 @abstractmethod
12 def sleep(self):
13 pass
14
15 class Dog(Animal):
16 #实现吃喝睡的方法
17 def eat(self):
18 super().eat()
19 # super(Dog, self).eat()
20 print('dog is eating')
21 def sleep(self):
22 print('dog is sleeping')
23
24 # d = Dog()
25 # d.eat()
26 a = Animal() #抽象类不能被实例化
抽象类
3.抽象类和接口类的区别:接口类不能实现方法,抽象类可以实现方法里面的内容
4.抽象类和接口类的相同点:都是用来做约束的,都不能被实例化
5.抽象类和接口类的使用:
当几个子类的父类有相同的功能需要被实现的时候就用抽象类
当几个子类有相同的功能,但是实现各不相同的时候就用接口类
6.python中的抽象类和接口类在Java里面的区别
接口类支持多继承
抽象类只支持单继承
三、多继承
在继承抽象类的过程中,我们应该尽量避免多继承;
而在继承接口的时候,我们反而鼓励你来多继承接口
接口隔离原则:
使用多个专门的接口,而不是用单一的总接口。即客户端不应该依赖那些不需要的接口
1 class A:
2 def test(self):
3 print('from A')
4 class B(A):
5 def test(self):
6 print('from B')
7 class C(A):
8 def test(self):
9 print('from C')
10 class D(A):
11 def test(self):
12 print('from D')
13 class E(B):pass
14 # def test(self):
15 # print('from E')
16
17 class F(E,D,C):pass
18 # def test(self):
19 # print('from F')
20
21
22 # b= B()
23 # b.test()
24 # d = D()
25 # d.test() #一级一级往上找,自己没有,就继承爹的,爹没有就找爷爷的
26 # 再找不到就报错了
27 f = F()
28 f.test()
29 print(F.mro()) #查看找父类的顺序
多继承
四、钻石继承
新式类:广度优先:横着找(如钻石继承图,谁先在前面就找谁)
经典类:深度优先:从上到下找
五、多态
多态指的是一类事物有多种形态(比如:老师.下课铃响了(),学生.下课铃响了(),老师执行的是下班操作,学生执行的是放学操作,虽然二者消息一样,但是执行的效果不同)
例如:动物有多种形态:人,狗,猪
1 from abc import ABCMeta,abstractmethod
2 class Animal(metaclass=ABCMeta):
3 @abstractmethod
4 def eat(self):pass
5 class Cat(Animal): #动物的形态之一:猫
6 def eat(self):
7 print('cat eat')
8 class Dog(Animal): #动物的形态之二:狗
9 def eat(self):
10 print('dog eat')
11
12 class Pig(Animal):pass #动物的形态之三:猪
13 def eat_fun(animal_obj): #定义一个函数让这个函数名去调用
14 animal_obj.eat()
15 c = Cat()
16 eat_fun(c) #函数名(对象)
17
18 d = Dog()
19 eat_fun(d)
20
21 c = Cat()
22 c.eat()
多态
python自带多态:
多态:同一类事物的多种状态
python里处处都是多态,只是我们一般发现不了
操作的时候不需要关心这个对象的数据类型,你只要用就行了
静态多态性(了解就好)
鸭子类型(如果两个类里面都有相同的方法,但是他们的类里面没有任何继承)
序列(str,list,tuple):有顺序的数据集合,这三个没有任何继承
python 继承进阶的更多相关文章
- python学习第十六天 --继承进阶篇
这一章节主要讲解面向对象高级编程->继承进阶篇,包括类多继承介绍和继承经典类和新式类属性的查找顺序不同之处. 多继承 上一章节我们讲到继承,子类继承父类,可以拥有父类的属性和方法,也可以进行扩展 ...
- Python类的继承(进阶5)
转载请标明出处: http://www.cnblogs.com/why168888/p/6411918.html 本文出自:[Edwin博客园] Python类的继承(进阶5) 1. python中什 ...
- Python爬虫进阶五之多线程的用法
前言 我们之前写的爬虫都是单个线程的?这怎么够?一旦一个地方卡到不动了,那不就永远等待下去了?为此我们可以使用多线程或者多进程来处理. 首先声明一点! 多线程和多进程是不一样的!一个是 thread ...
- Python面向对象进阶(二)
Python面向对象进阶2.html :first-child{margin-top:0!important}img.plugin{box-shadow:0 1px 3px rgba(0,0,0,.1 ...
- python 继承中的super
python继承中子类访问父类的方法(包括__init__)主要有两种方法,一种是调用父类的未绑定方法,另一种是使用super(仅仅对于新式类),看下面的两个例子: #coding:utf-8 cla ...
- python继承
Python继承 继承实例: 父类和子类的关系: 继承树: 没有父类就继承object类,不要忘记调用super().__init__来初始化父类 代码: class Person(object): ...
- python继承——封装
python继承--封装 1 为什么要封装 封装数据的主要原因是:保护隐私 封装方法的主要原因是:隔离复杂度 2 封装分为两个层面 第一个层面的封装(什么都不用做):创建类和对象会分别创建二者的名称空 ...
- python最全学习资料:python基础进阶+人工智能+机器学习+神经网络(包括黑马程序员2017年12月python视频(百度云链接))
首先用数据说话,看看资料大小,达到675G 承诺:真实资料.不加密,获取资料请加QQ:122317653 包含内容:1.python基础+进阶+应用项目实战 2.神经网络算法+python应用 3.人 ...
- python学习大全:python基础进阶+人工智能+机器学习+神经网络
首先用数据说话,看看资料大小,达到675G承诺:真实资料.不加密.(鉴于太多朋友加我QQ,我无法及时回复,) 方便的朋友给我点赞.评论下,谢谢!(内容较大,多次保存) [hide]链接:[url]ht ...
随机推荐
- Java注解处理器
Java注解处理器 2015/03/03 | 分类: 基础技术 | 0 条评论 | 标签: 注解 分享到:1 译文出处: race604.com 原文出处:Hannes Dorfmann Java ...
- 【转】一次完整的HTTP请求所经历的7个步骤
HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤: 1. 建立TCP连接 在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该 ...
- Spring data jpa 使用技巧记录
软件152 尹以操 最近在用Springboot 以及Spring data jpa ,使用jpa可以让我更方便的操作数据库,特开此帖记录使用jpa的一些小技巧. 一.使用spring data j ...
- js职责链模式
职责链模式(Chain of Responsiblity),使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为 ...
- java:输出流程printStream
// TODO 自动生成的方法存根 //路径文件 File file = new File("F:"+File.separator+"work"+File.se ...
- deep learning (六)logistic(逻辑斯蒂)回归中L2范数的应用
zaish上一节讲了线性回归中L2范数的应用,这里继续logistic回归L2范数的应用. 先说一下问题:有一堆二维数据点,这些点的标记有的是1,有的是0.我们的任务就是制作一个分界面区分出来这些点. ...
- JavaScript如何处理解析JSON数据详解
JSON (JavaScript Object Notation)一种简单的数据格式,比xml更轻巧. JSON 是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON ...
- hive 遇到的问题及解决方法
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.ipc.StandbyException): Operation category RE ...
- C#中的索引器的简单理解和用法
索引器是一种特殊的类成员,它能够让对象以类似数组的方式来存取,使程序看起来更为直观,更容易编写. 1.索引器的定义 C#中的类成员可以是任意类型,包括数组和集合.当一个类包含了数组和集合成员时,索引器 ...
- RESTful 组件
1. CBV FBV: url("index/",index) # index(request) url("index/(\d+)",index) # inde ...