继承进阶

面向对象

  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 继承进阶的更多相关文章

  1. python学习第十六天 --继承进阶篇

    这一章节主要讲解面向对象高级编程->继承进阶篇,包括类多继承介绍和继承经典类和新式类属性的查找顺序不同之处. 多继承 上一章节我们讲到继承,子类继承父类,可以拥有父类的属性和方法,也可以进行扩展 ...

  2. Python类的继承(进阶5)

    转载请标明出处: http://www.cnblogs.com/why168888/p/6411918.html 本文出自:[Edwin博客园] Python类的继承(进阶5) 1. python中什 ...

  3. Python爬虫进阶五之多线程的用法

    前言 我们之前写的爬虫都是单个线程的?这怎么够?一旦一个地方卡到不动了,那不就永远等待下去了?为此我们可以使用多线程或者多进程来处理. 首先声明一点! 多线程和多进程是不一样的!一个是 thread ...

  4. Python面向对象进阶(二)

    Python面向对象进阶2.html :first-child{margin-top:0!important}img.plugin{box-shadow:0 1px 3px rgba(0,0,0,.1 ...

  5. python 继承中的super

    python继承中子类访问父类的方法(包括__init__)主要有两种方法,一种是调用父类的未绑定方法,另一种是使用super(仅仅对于新式类),看下面的两个例子: #coding:utf-8 cla ...

  6. python继承

    Python继承 继承实例: 父类和子类的关系: 继承树: 没有父类就继承object类,不要忘记调用super().__init__来初始化父类 代码: class Person(object): ...

  7. python继承——封装

    python继承--封装 1 为什么要封装 封装数据的主要原因是:保护隐私 封装方法的主要原因是:隔离复杂度 2 封装分为两个层面 第一个层面的封装(什么都不用做):创建类和对象会分别创建二者的名称空 ...

  8. python最全学习资料:python基础进阶+人工智能+机器学习+神经网络(包括黑马程序员2017年12月python视频(百度云链接))

    首先用数据说话,看看资料大小,达到675G 承诺:真实资料.不加密,获取资料请加QQ:122317653 包含内容:1.python基础+进阶+应用项目实战 2.神经网络算法+python应用 3.人 ...

  9. python学习大全:python基础进阶+人工智能+机器学习+神经网络

    首先用数据说话,看看资料大小,达到675G承诺:真实资料.不加密.(鉴于太多朋友加我QQ,我无法及时回复,) 方便的朋友给我点赞.评论下,谢谢!(内容较大,多次保存) [hide]链接:[url]ht ...

随机推荐

  1. Java注解处理器

    Java注解处理器 2015/03/03 | 分类: 基础技术 | 0 条评论 | 标签: 注解 分享到:1 译文出处: race604.com   原文出处:Hannes Dorfmann Java ...

  2. 【转】一次完整的HTTP请求所经历的7个步骤

    HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤: 1. 建立TCP连接 在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该 ...

  3. Spring data jpa 使用技巧记录

    软件152 尹以操 最近在用Springboot 以及Spring data jpa  ,使用jpa可以让我更方便的操作数据库,特开此帖记录使用jpa的一些小技巧. 一.使用spring data j ...

  4. js职责链模式

    职责链模式(Chain of Responsiblity),使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为 ...

  5. java:输出流程printStream

    // TODO 自动生成的方法存根 //路径文件 File file = new File("F:"+File.separator+"work"+File.se ...

  6. deep learning (六)logistic(逻辑斯蒂)回归中L2范数的应用

    zaish上一节讲了线性回归中L2范数的应用,这里继续logistic回归L2范数的应用. 先说一下问题:有一堆二维数据点,这些点的标记有的是1,有的是0.我们的任务就是制作一个分界面区分出来这些点. ...

  7. JavaScript如何处理解析JSON数据详解

    JSON (JavaScript Object Notation)一种简单的数据格式,比xml更轻巧. JSON 是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON ...

  8. hive 遇到的问题及解决方法

    org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.ipc.StandbyException): Operation category RE ...

  9. C#中的索引器的简单理解和用法

    索引器是一种特殊的类成员,它能够让对象以类似数组的方式来存取,使程序看起来更为直观,更容易编写. 1.索引器的定义 C#中的类成员可以是任意类型,包括数组和集合.当一个类包含了数组和集合成员时,索引器 ...

  10. RESTful 组件

    1. CBV FBV: url("index/",index) # index(request) url("index/(\d+)",index) # inde ...