python基础第二十一天(多态,抽象类和接口类)

今日主要内容:

1.接口类和抽象类

2.多态和鸭子类型

一.

什么是接口类

接口:

接口是Java中特有的一种数据形式,一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。接口并不是类,编写接口的方式和类很相似.

接口类:

python中接口类继承了Java中接口的定义,用于子类继承父类的接口方法的定义,采用单继承的模式,实现python中的多继承意义.

所以python中,没有接口的定义,是因为python可以实现多继承.

接口类的实现:

from abc import ABCMeta,abstractmethod
class IStream(metaclass = ABCMeta):
    @abstractmethod
    def read():pass
    @abstractmethod
    def write():pass

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

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

什么是抽象类:

抽象类类似于Java中的抽象类规则,并且需要借助abc模块实现.抽象类是一个特殊的类,抽象类只能被继承不能被实例化.

抽象类被定义的目的:

由于抽象类不能被实例化,所以创建出来就是为了被继承,所以python中设置抽象类的目的是为了规范方法的定义.即,抽象类内的方法如何定义的,定义的名称是什么,被继承的类都必须按照抽象类内的方法进行设计.

抽象基类(父类)的主要用途就是在代码中检查某些类是否特点类型,实现了特定接口

 如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类是从一堆中抽取相同的内容而来的,内容包括数据属性和函数属性

抽象类和接口类总结:

抽象类的本质还是类,指的是一组类的相似性,包括数据属性(如all_type)和函数属性(如read、write),而接口只强调函数属性的相似性。

抽象类是一个介于类和接口直接的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计 

在python中,并没有接口类这种东西,即便不通过专门的模块定义接口,我们也应该有一些基本的概念。

1.多继承问题

在继承抽象类的过程中,我们应该尽量避免多继承;
而在继承接口的时候,我们反而鼓励你来多继承接口

接口隔离原则:
使用多个专门的接口,而不使用单一的总接口。即客户端不应该依赖那些不需要的接口。

2.方法的实现

在抽象类中,我们可以对一些抽象方法做出基础实现;
而在接口类中,任何方法都只是一种规范,具体的功能需要子类实现

多态和鸭子类型

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

什么是多态性:

多态性是指在不考虑实例类型的情况下使用实例

复制代码
在面向对象方法中一般是这样表述多态性:
向不同的对象发送同一条消息(!!!obj.func():是调用了obj的方法func,又称为向obj发送了一条消息func),不同的对象在接收时会产生不同的行为(即方法)。
也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。

比如:老师.下课铃响了(),学生.下课铃响了(),老师执行的是下班操作,学生执行的是放学操作,虽然二者消息一样,但是执行的效果不同

鸭子类型:

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

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

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

例1:利用标准库中定义的各种‘与文件类似’的对象,尽管这些对象的工作方式像文件,但他们没有继承内置文件对象的方法

例2:序列类型有多种形态:字符串,列表,元组,但他们直接没有直接的继承关系

#二者都像鸭子,二者看起来都像文件,因而就可以当文件一样去用
class TxtFile:
    def read(self):
        pass

    def write(self):
        pass

class DiskFile:
    def read(self):
        pass
    def write(self):
        pass

以上就是今日内容,大部分都是需要记住的概念

原文地址:https://www.cnblogs.com/tom2ling/p/8857927.html