继承进阶

面向对象

  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. MapReduce-排序(全部排序、辅助排序)

    排序 排序是MapReduce的核心技术. 1.准备 示例:按照气温字段对天气数据集排序.由于气温字段是有符号的整数,所以不能将该字段视为Text对象并以字典顺序排序.反之,用顺序文件存储数据,其In ...

  2. ML 逻辑回归 Logistic Regression

    逻辑回归 Logistic Regression 1 分类 Classification 首先我们来看看使用线性回归来解决分类会出现的问题.下图中,我们加入了一个训练集,产生的新的假设函数使得我们进行 ...

  3. iphone的一些坑

    1.<div contenteditable></div>需要添加css user-select: text;才能输入. 2.css属性animation一直存在,添加了-we ...

  4. 机器学习(二)—支持向量机SVM

    1.SVM的原理是什么? SVM是一种二类分类模型.它的基本模型是在特征空间中寻找间隔最大化的分离超平面的线性分类器.(间隔最大是它有别于感知机) 试图寻找一个超平面来对样本分割,把样本中的正例和反例 ...

  5. 免费获得 NTFS for Mac 12. Special Edition 激活码活动

    进入页面:http://www.paragon-drivers.com/cn/ntfs-mac-free/ntfs-free.html 先点击“下载”按钮,下载 NTFS for Mac 12. Sp ...

  6. JProfiler远程监控 -转

    1. 服务端安装JProfiler(与客户端版本一致) 2. 客户端配置连接: A).session——integration wizards——New remote integration B).选 ...

  7. jquery判断密码是否一致?

    密码 请输入密码 重新输入密码 请输入新密码 <input type="text" id="btn0"> 密码 <span class=&qu ...

  8. 简单的shell语句

    1,重启tomcat 脚本: pid=`ps -ef|grep tomcat |grep -v grep |awk '{print $2}'` ##取tomcat的进程号,awk处理字符串 ,取一行的 ...

  9. 条款50:使用自定义的new以及delete的时机会

    几种最常见的这么做的理由:     1.用来检测运行上的错误:可以在分配的内存空间的起始以及结束分别放置单独的签名     2.为了强化性能     3.为了收集使用上的统计数据 按照第一点就可以举一 ...

  10. stencil in unity3d

    Pass { Stencil { Ref Comp Always Pass REPLACE } AlphaTest Greater Blend SrcAlpha OneMinusSrcAlpha Co ...