继承进阶

面向对象

  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. Python-flask中数据库连接池DBUtils

    一.DBUtils DBUtils是Python的一个用于实现数据库连接池的模块. 连接池的三种模式: 第一种模式:             它的缺点:每一次请求反复创建数据库的链接,链接的次数太多 ...

  2. numpy nonzero与isnan

    nonzero 直接看例子: In [83]: x = np.array([[1,0,0], [0,2,0], [1,1,0]]) In [84]: x.shape Out[84]: (3L, 3L) ...

  3. VC++异常捕获??

    1. std: #include <string> #include<iostream> // for cerr //#include <stdexcept> // ...

  4. MFC 去掉CWnd的边框

    使用继承CWnd的控件,总是有边框,使用 ModifyStyle(WS_BORDER,0);  不能去掉边框,包括SetWindowLong设置去掉WS_BORDER, 也不行. 最后找到了方法就是M ...

  5. 如何实现vue-cli搭建的前端项目的自动打包

    实现vue-cli + webpack +vue项目的自动打包: 后台java代码: public class OpenDirectory { public static void main(Stri ...

  6. Java企业微信开发_15_查询企业微信域名对应的所有ip

    一.前言 二.方法 1.在线网站 百度搜索"域名查IP",可查到如下网站,输入域名即可查到所有IP: 站长工具 site.ip138.com tools.ipip.net 2.li ...

  7. MAC 下配置MQTT 服务器Mosquitto

    一.简单介绍   1.MQTT是IBM开发的一个即时通讯协议.MQTT是面向M2M和物联网的连接协议,采用轻量级发布和订阅消息传输机制.    2.Mosquitto是一款实现了 MQTT v3.1 ...

  8. 【SQL查询】查询的值为空时,给出默认值_NVL函数

    格式为: NVL( string1, replace_with) 功能:如果string1为NULL,则NVL函数返回replace_with的值,否则返回string1的值. 引申一下,此NVL的作 ...

  9. python数据类型、操作符

    python中数据类型包含:int,float,boolean,string,list(列表),set(集合),dictionary(字典) 数据类型转换: ①字符串 转 int:>>&g ...

  10. DECLARE_MESSAGE_MAP用法

    DECLARE_MESSAGE_MAP( ) 说明:  你的程序中的每一个CCmdTarget的派生类都可以提供一个消息映射以处理消息.在你的类声明的末尾使用DECLARE_MESSAGE_MAP宏. ...