接口类

抽象类

钻石继承

多态

鸭子类型

接口类

接口类

继承有两种用途:

一:继承基类的方法,并且做出自己的改变或者扩展(代码重用)

二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能

代码如下

class Applepay:
def pay(self,money):
print('apple pay 支付了%s'%money) class Alipay:
def pay(self,money):
print('支付宝 支付了%s'%money) class Wechatpay:
def fuqian(self,money):
print('微信支付了%s'%money) def payment(pay_obj,money):
pay_obj.pay(money) apple1 = Applepay()#实例化一个对象
apple1.pay(20)#调用里面的函数
payment(apple1,50)#通过payment函数调用也可以
 

但是我们实例化一个Wechatpay不会报错但是如果调用pyament函数就会出错

class Applepay:
def pay(self,money):
print('apple pay 支付了%s'%money) class Alipay:
def pay(self,money):
print('支付宝 支付了%s'%money) class Wechatpay:
def fuqian(self,money):
print('微信支付了%s'%money) def payment(pay_obj,money):
pay_obj.pay(money) # apple1 = Applepay()#实例化一个对象
# apple1.pay(20)#调用里面的函数
# payment(apple1,50)#通过payment函数调用也可以 wechat1 = Wechatpay()
payment(wechat1,200)

这不是我们想要的结果,我们希望在函数运行时就会发现发现(实例化时就会发现错误)

通过调用接口类,下面所有的类都要根据接口类的格式来

from abc import ABCMeta,abstractmethod
class Payment(metaclass = ABCMeta): #metaclass --> 元类
@abstractmethod
def pay(self,money):pass class Applepay(Payment):
def pay(self,money):
print('apple pay 支付了%s'%money) class Alipay(Payment):
def pay(self,money):
print('支付宝 支付了%s'%money) class Wechatpay(Payment):
def fuqian(self,money):
print('微信支付了%s'%money)
wechat1 = Wechatpay()#实例化时就会报错

接口类的作用:约束继承接口类的子类必须实现被abstractmethod来装饰,在接口类中不要做实现,接口类不能被实例化。

实践中,继承的第一种含义意义并不很大,甚至常常是有害的。因为它使得子类与基类出现强耦合。

继承的第二种含义非常重要。它又叫“接口继承”。
接口继承实质上是要求“做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理实现了特定接口的所有对象”——这在程序设计上,叫做归一化。

归一化使得高层的外部使用者可以不加区分的处理所有接口兼容的对象集合——就好象linux的泛文件概念一样,所有东西都可以当文件处理,不必关心它是内存、磁盘、网络还是屏幕(当然,对底层设计者,当然也可以区分出“字符设备”和“块设备”,然后做出针对性的设计:细致到什么程度,视需求而定)。

接口类符合:依赖倒置原则

依赖倒置原则:
高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该应该依赖细节;细节应该依赖抽象。换言之,要针对接口编程,而不是针对实现编程

抽象类(在类中的方法可以实现一定的实现)(从小范围到大范围

from abc import ABCMeta,abstractmethod
class Animal(metaclass=ABCMeta):
@abstractmethod
def eat(self):
print('打开粮食的袋子')#抽象类可以实例化一些方法
print('放一个吃饭的碗')
print('把粮食倒在碗里') @abstractmethod
def sleep(self):
pass class Dog(Animal):
def eat(self):
super().eat()#重写父类方法
print('dog is eating')#给子类一个新的方法 def sleep(self):
print('dog is sleeping')
d=Dog()
d.eat()

我们发现抽象类与接口类的区别就是在类内是否可以实现。

#抽象类
#在Python里 默认是有的
#父类的方法 子类必须实现
#抽象类 不能被实例化
#抽象类内的方法 可以被简单实现
#接口类(在抽象类的基础上)
#在python里 默认是没有的
#接口类中的方法 不能被实现
#原则:抽象类最好不要用多继承,而接口类可以

抽象类与接口类的区别:

当几个子类的父亲有相同的功能需要被实现的时候就用抽象类。

当几个子类有相同的功能,但是实现是各个不相同的时候就用接口类。

钻石继承      

python里分为新式类和经典类。新式类是广度优先;经典类是深度优先。在新式类内可以通过.mro来看到继承的顺序。

总结:

继承的作用:    

减少代码的重用
提高代码可读性
规范编程模式

几个名词:

抽象:抽象即抽取类似或者说比较像的部分。是一个从具题到抽象的过程。
继承:子类继承了父类的方法和属性
派生:子类在父类方法和属性的基础上产生了新的方法和属性

抽象类与接口类

1.多继承问题
在继承抽象类的过程中,我们应该尽量避免多继承;
而在继承接口的时候,我们反而鼓励你来多继承接口 2.方法的实现
在抽象类中,我们可以对一些抽象方法做出基础实现;
而在接口类中,任何方法都只是一种规范,具体的功能需要子类实现

钻石继承:

新式类:广度优先
经典类:深度优先

多态:

多态指的是一类事物有多种形态

class Animal:pass
class Cat(Animal):
def eat(self):
print('cat eat')
class Dog(Animal):
def eat(self):
print('dog eat')
def eat_func(a):
a.eat() c = Cat()
eat_func(c)
d = Dog()
eat_func(d) #python自带多态:#1 同一类事物的不同状态
#2 操作的时候不需要关心这个对象的数据类型,只要去用就可以了
鸭子类型

Python崇尚鸭子类型,即‘如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子’

python程序员通常根据这种行为来编写程序。例如,如果想编写现有对象的自定义版本,可以继承该对象

也可以创建一个外观和行为像,但与它无任何关系的全新对象,后者通常用于保存程序组件的松耦合度。

 

python之面向对象进阶的更多相关文章

  1. python基础——面向对象进阶下

    python基础--面向对象进阶下 1 __setitem__,__getitem,__delitem__ 把对象操作属性模拟成字典的格式 想对比__getattr__(), __setattr__( ...

  2. python基础——面向对象进阶

    python基础--面向对象进阶 1.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 ...

  3. Python 3 面向对象进阶

    Python 3 面向对象进阶 一.    isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的 ...

  4. day021|python之面向对象进阶1

    面向对象进阶 目录 面向对象进阶 1 继承 1.1 继承入门 1.1.1 继承基础 1.1.2 类的基本使用 1.2 多继承 1.2.1 多继承的基本使用 1.2.2 多继承以后的重复性 1.3 类的 ...

  5. python基础-面向对象进阶

    一.什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被 ...

  6. python学习------面向对象进阶

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object) ...

  7. python之面向对象进阶2

    封装.property装饰器 封装分为3种情况:封装对象的属性.封装类的属性.封装方法. 封装对象的属性:(在属性名前加双下划线__) class Person: def __init__(self, ...

  8. python开发面向对象进阶:反射&内置函数

    isinstance和issubclass isinstance(obj,cls)检查是否obj是否是类 cls 的对象或者子类的对象 class Foo(object): pass class ba ...

  9. Python之面向对象进阶------反射(Day26)

    一 classmethod class Classmethod_Demo(): role = 'dog' @classmethod def func(cls): print(cls.role) Cla ...

  10. python之面向对象进阶3

    1.isinstace和issubclass 2.staticmethod和classmethod 3.反射(hasattr.getattr.setattr.delattr等四个方法) 4.内置方法 ...

随机推荐

  1. SQL优化原则(转)

    一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统 ...

  2. springboot aop 自定义注解方式实现完善日志记录(完整源码)

    版权声明:本文为博主原创文章,欢迎转载,转载请注明作者.原文超链接 一:功能简介 本文主要记录如何使用aop切面的方式来实现日志记录功能. 主要记录的信息有: 操作人,方法名,参数,运行时间,操作类型 ...

  3. MJPEG 格式分析

    MJPEG简介 MJPEG(技术即运动静止图像(或逐帧)压缩技术)是24-bit的"true-color"影像标准.MJPEG的工作是将RGB格式的影像转换成YCrCB格式,目的是 ...

  4. Asp.Net4.5 mvc4(二) 页面创建与讲解

    一.Contorl 通过目录结构我们可以看到contorllers类的命名方式 命名规则:前缀+Controller. 在看看contorller中的action方法 using System; us ...

  5. 多啦爱梦~多啦A梦CSS3测试源代码

    先直接看图片,感觉一下!一直以来,我们都在说浏览器对CSS3支持度这个问题.可是,鉴于知识认识水平问题,又没几个人真正了解CSS3是什么东西,和它在网站显示上的重要性.现在好了,日本某位大神写了个CS ...

  6. request请求 HTTPBody 格式

    //Json格式       [mtbRequset setValue:@"application/json" forHTTPHeaderField:@"Content- ...

  7. EmitMapper的使用小结

    最近公司开发项目前端使用一个js框架,后端使用ef,js前台读取的json采用实体的dto来进行生成. 在网上看到了EmitMapper相对其他映射框架处理速度可以更快,就拿来用了.下面是代码中常用的 ...

  8. 畅通工程续(HDU 1874)附上超详细源代码

    Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行 ...

  9. 【20181031】arcgis10.6破解不成功的问题

    首先需要下好正确版本的crack文件,license10.6文件夹里应该有ARCGIS.exe和service.txt两个文件,我的问题就是因为crack文件不完整,没有ARCGIS.exe文件,所以 ...

  10. AWT初步— 事件处理模型

    之前学习的内容只能形成一个用户界面,而用户不能对其有实际的操作,也就是说用户界面没有任何功能.要能够让图形界面接收用户的操作,就必须给各个组件加上事件处理机制.在事件处理的过程中,主要涉及三类对象: ...