python抽象基类的作用_Python:多态、鸭子模型和抽象基类

1. 多态

什么是多态

-- 多态,指的是一种事务具有多种形态;

-- python是一种动态语言,默认支持多态,同一个方法 调用 不同的类对象 ,执行的 结果各不相同;

多态实现

-- 继承:不同子类 继承 同一父类;

-- 重写:子类重写 同一个方法,保证执行结果各不相同;

示例

-- 有如下代码:

>>> class Animals():

... def talk(self):

... print("Animal talk")

...

>>>

>>> class People(Animals): # 继承 Animals 类

... def talk(self):

... print('People speak language')

...

>>>

>>> class Cat(Animals): # 继承 Animals 类

... def talk(self):

... print('Cat say miaomiao')

...

>>>

>>> cat = Cat()

>>> peo = People()

>>>

>>> cat.talk() # 调用 talk 方法

Cat say miaomiao

>>> peo.talk() # 调用 talk 方法

People speak language

如上所示:

-- cat 和 peo 两个对象调用同一个 talk() 方法;

-- 最后得到两种不同的结果;

多态的优点:

-- 多态可以增加代码的灵活度;

-- 是调用方法的技巧,不会影响到类的内部设计;

-- 多态可以看做 接口函数的重用,同一种接口方法 通过 接收不同的类 对象,从而实现不同的功能;

多态使用场景:

-- 方法参数接收同一父类的不同子类对象。

2. 鸭子模型

什么是鸭子模型

-- 当看到一只鸟走起来像鸭子,游泳起来也像鸭子,叫起来也像鸭子,那么这只鸟就可以被称为鸭子;

-- 鸭子模型和多态一样,都是接受不同的类对象,并调用相同的方法(即:鸭子的 游泳 和 叫 方法);

-- 对于一个鸭子模型来说,我们并 不关心接收的类对象是否真的是鸭子类,只关心这个类是如何被使用的;

-- 注意:如果这些需要被调用的方法不存在,那么将引发一个运行时错误。

示例

-- 有如下代码:

>>> class Duck:

... def quack(self):

... print("duck quack")

...

>>>

>>> class Bird: # Bird 类与 Duck 类无继承关系

... def quack(self):

... print("bird quack")

...

>>>

>>> class Dog: # Dog类与 Duck 类无继承关系

... def quack(self):

... print("dog quack")

...

>>>

>>> def animal_quack(animal): # animal_quack 方法可以调用任何对象的 quack() 方法,不关心对象是谁

... animal.quack()

...

>>>

>>> duck = Duck()

>>> bird = Bird() # bird 实例与 duck 实例无任何关系

>>> dog = Dog() # dog 实例与 duck 实例无任何关系

>>>

>>> for animal in [duck, bird, dog]:

... animal_quack(animal)

...

duck quack

bird quack

dog quack

-- 如上所示:

-- duck、bird、dog 分别来自三个不同的类,而且类之间是 没有继承关系 的;

-- duck、bird、dog 调用 animal_quack 方法,得到三种不同的结果,符合多态的特征;

鸭子模型的优点:

-- 鸭子模型不关关心类对象是什么,不需要类之间具有继承关系;

-- 鸭子模型让代码比多态更加灵活度;

多态使用场景:

-- 鸭子模型中,接收不同的类将会产生不同的行为,而无须明确知道这个类实际上是什么,这是多态的重要应用场景;

-- 实际生产环境中,主要用于 接口开发,即用同一个函数接收不同的类对象,从而实现不同的功能,而且无需关注对象之间的继承关系;

3. 抽象基类

什么是抽象基类

-- 抽象基类,这个词可能听着比较"深奥",其实 抽象 就是 假 的意思,基类 就是 父类,抽象基类 就是 假父类;

-- 具体来说,由 abc.ABCMeta 这个元类实现的类,就是抽象基类;

示例:

-- 如下代码中的 AbstractClass 类继承自 abc.ABCMeta,AbstractClass 就是抽象基类;

class AbstractClass(metaclass=abc.ABCMeta):

pass

抽象基类的作用

-- 判断是否为某个对象的实例

>>> class MyList(object):

... def __init__(self, my_list):

... self.my_list= my_list

... def __len__(self):

... return len(self.my_list)

...

>>>

>>> class NewList(MyList): # NewList 继承自 MyList

... pass

...

>>> ml = MyList(["a", "b", "c"])

>>>

>>> from collections.abc import Sized, Iterable

>>>

>>> print(isinstance(ml, Sized))

True # 返回 True,因为这里会检查实例对象中有没有__len__方法,有即输出True

>>> nl = NewList([1, 2, 3])

>>> print(isinstance(nl, MyList))

True # 返回 True,因为 nl 实例化的类 NewList 同时也是 MyList 的子类

-- 强制要求父类被子类继承,并在子类实现某个方法,否则子类初始化时就会报错;

>>> from abc import ABCMeta,abstractmethod

>>>

>>>

>>> class Source(metaclass=ABCMeta): # 创建抽象基类 Source

... @abstractmethod # 表示装饰的方法必须被子类所实现,否则会报错

... def get(self,key):

... pass

...

>>>

>>> class Mysource(Source): # 子类 Mysource 继承自 抽象基类 Source

... def get(self,key): # 实现 get 方法,这个方法是 抽象基类 Source 强制要求实现的

... pass

...

>>>

>>> class Mysource1(Source): # 子类 Mysource1 没有实现 抽象基类 Source 强制要求实现的 get 方法

... pass

...

>>> test = Source() # test 直接实例化 Source 父类

Traceback (most recent call last): # 此处报错,因为抽象类无法实现实例化

File "", line 1, in

TypeError: Can't instantiate abstract class Source with abstract methods get

>>>

>>> test = Mysource() # 此处实例化 Mysource,未报错

>>>

>>> test = Mysource1()

Traceback (most recent call last): # 报错,继承类必须实现抽象类的方法

File "", line 1, in

TypeError: Can't instantiate abstract class Mysource1 with abstract methods get

抽象基类使用场景

-- 接口强制规定,主要是 强制子类实现某个方法,否则就提示报错;

抽象基类的有点:

-- 处理继承问题方面更加规范、系统;

-- 明确调用之间的相互关系,使得继承层次更加清晰;

抽象基类的缺点:

-- 抽象基类在 python 并非在于用来继承,主要用来理解 python继承 的定义,应该 尽量使用鸭子模型;

-- 如果一定要继承接口的话,比较 推荐多继承,抽象基类容易 设计过度;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472960.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

非抢占式优先级调度算法_华为鸿蒙操作系统内核真面目之抢占式和非抢占式内核...

华为鸿蒙操作系统内核真面目之抢占式和非抢占式内核众所周知华为鸿蒙操作系统内核是Linux内核。而Linux内核即是抢占式内核也是非抢占式内核。设置软件优先级在优先级在0-99之间是抢占式优先级。设置优先级在100-139之间是非抢占式优先级。从华为官方发布的信息--优先级高的任务…

windows下python 使用CRF++ python接口的配置

1. 下载包含python接口的版本的CRF并安装,安装成功后查看python文件夹包含setup.py 文件,内容如下: #!/usr/bin/env python from distutils.core import setup,Extension,os import string setup(name "mecab-python", p…

TensorFlow 2.0 - Hub 模型复用

文章目录1. tfhub2. 例子:神经风格转换3. retrain 例子学习于:简单粗暴 TensorFlow 2 1. tfhub 网址: https://hub.tensorflow.google.cn/ https://tfhub.dev/ 可以搜索,下载模型 安装包 pip install tensorflow-hub import…

微服务 注册中心的作用_102,谈谈微服务注册中心zookeeperamp;Eureka

首先,大家要明确一点微服务注册中心是一个重要的组件,解决的是服务的注册和发现的问题,而zookeeper,Eureka都只是其中一款落地实现的产品,再比如Nacos也是如此,所以关键是掌握注册中心的工作原理&#xff0…

python2转python3代码_2to3 – 自动Python 2到3代码翻译 – 开发工具(Python教程)(参考资料)...

使用2to3 2to3通常与Python解释器一起安装为脚本。它也位于Python根目录的Tools/scripts目录下 2to3的基本参数是要转换的文件或目录列表。这些目录以递归方式遍历Python源. 这是一个示例Python 2.x源文件, def greet(name): print "Hello, {0}!".format(…

文本表示

1 one-hot representation 该单词对应所在元素为1,向量中其他元素均为0,向量的维度就等于词库中的单词数目  所有向量都是互相正交的,我们无法有效的表示两个向量间的相似度  向量维度过大。 from sklearn.feature_extraction.text…

天池 在线编程 课程表(拓扑排序 + 回溯)

文章目录1. 题目2. 解题1. 题目 总共有n个课程,从0到n-1。 有些课程可能有先决条件,例如,你想修课程0,你必须先修一门课程1,这两门课之间的关系表示为:[0,1] 给定课程的总数和先决条件对的列表,返回你可以…

fence机制 linux_Linux ha fence设备测试

另外,在配置RHCS5.3时,Fence设备只ping通还不行,还必须经过测试,我在网上找了一篇IPMI的文章,现粘贴如下:What is IPMI?Intelligent Platform Management Interface[edit]AdvantagesLow cost.Available on…

Apache2.4 与 PHP 5.5 64位版的安装配置

我的环境:windows7 旗舰版 64位 首先下载相关文件: php 5.5.0 windows 64版 http://windows.php.net/download/#php-5.5 (选择 64位的下载) apache2.4 压缩版下载 http://www.apachelounge.com/download/VC11/ 下载版本一定要对应…

java 父子级json组装不用递归_2020面试阿里Java研发岗题库总结,想虐面试官不能错过的面试宝典...

前言:虽然天猫,蚂蚁金,菜鸟都归属阿里旗下,但每个面试官问的问题都不一样,相同点主要在流程方面。面试开始会让自我介绍,主要业务架构和技术架构两部分。业务架构一般不会深究,但要面试官听明白&#xff0c…

LeetCode 1748. 唯一元素的和

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums 。 数组中唯一元素是那些只出现 恰好一次 的元素。 请你返回 nums 中唯一元素的 和 。 示例 1: 输入:nums [1,2,3,2] 输出:4 解释:唯一元素为 [1,3] ,和为 4…

朵唯机器人怎么连网_平遥古城推出机器人导游 可伴游还可骑行

近日,一组集景点讲解、语音互动等多种功能于一身的机器人亮相平遥古城,引发游客关注。2月27日,北京青年报记者从景区旅游公司处了解到,这批机器人导游已经上岗5天,主要是为了填补下午5点人工导游下班后,古城…

【DFS】HDU 1364 POJ 1071 Illusive Chase

数据水了。。。 不知道正解是什么 将TOM放在一个0上经过输入的 1 2 R 这样走 还能在图上则这个点可行&#xff08;走的过程中不能走出图&#xff09; 求有几个0 可行 直接dfs 完全没有别的思路 题目要求必须 走 A - B 步 所以在走A步不能遇到 1 #include <cstdio> #inc…

python类中变量作用域_Python中的变量作用域

1、块级作用域 1 if 1 1:2 name "lzl" 3 4 print(name) //输出lzl5 6 7 for i in range(10):8 age i9 10 print(age) //输出9 在Java/C#中&#xff0c;执行上面的代码会提示name&#xff0c;age没有定义&#xff0c;而在Python中可以执行成功&#xff0c;这是因为在…

评论数据获取、词频统计、词云图

# coding: utf-8 # In[2]: import urllib.request import re import requests import time import random import json # 设置请求头 headers (User-Agent, Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537…

pytorch 语义分割loss_vedaseg:基于pytorch的开源语义分割工具库,更多模型支持,更易拓展...

加入极市专业CV交流群&#xff0c;与6000来自腾讯&#xff0c;华为&#xff0c;百度&#xff0c;北大&#xff0c;清华&#xff0c;中科院等名企名校视觉开发者互动交流&#xff01;更有机会与李开复老师等大牛群内互动&#xff01;同时提供每月大咖直播分享、真实项目需求对接…

LeetCode 1749. 任意子数组和的绝对值的最大值(前缀和)

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums 。 一个子数组 [numsl, numsl1, ..., numsr-1, numsr] 的 和的绝对值 为 abs(numsl numsl1 ... numsr-1 numsr) 。 请你找出 nums 中 和的绝对值 最大的任意子数组&#xff08;可能为空&#xff09;&#xff0c;并返…

字符设备驱动0:一个简单但完整的字符设备驱动程序

参考&#xff1a; linux设备驱动程序之简单字符设备驱动 【很详细,必看】http://www.cnblogs.com/geneil/archive/2011/12/03/2272869.html //在驱动入口函数中&#xff0c;使用register_chrdev添加字符设备驱动&#xff1a;#include <linux/module.h> #include <linu…

同一个项目相互调接口_408计算机网络D3-第二章:网络体系结构与参考模型(上)分层结构-协议-接口-服务...

网络体系结构是从功能上描述计算机网络结构。计算机网络体系结构简称网络体系结构是分层结构&#xff1b;是计算机网络的各层及其协议的集合。每层遵循某个/些网络协议以完成本层功能。分层结构-协议-接口-服务首先就是为什么要分层发送文件前要完成的工作发起通信的计算机必须…

自动摘要

#!/user/bin/python # coding:utf-8 import nltk import numpy import jieba import codecs import os class SummaryTxt: def __init__(self,stopwordspath): # 单词数量 self.N 100 # 单词间的距离 self.CLUSTER_THRESHOLD 5 …