首页 > 编程语言 >Python中的抽象基类介绍

Python中的抽象基类介绍

时间:2023-04-09 13:34:22浏览次数:49  
标签:Python python say Animail 基类 抽象 metaclass


    从上一篇文章(Python中鸭子类型与多态介绍)中,我们了解到了python的鸭子类型和多态。继承提供了多态的基础,而多态则使继承更加灵活和强大。那么今天,让我们再来一起了解一下python里面的抽象基类。

Python中的抽象基类(Abstract Base Classes,简称abc)是一种特殊的类,它用于定义一组抽象方法,这些方法必须在子类中被实现。抽象基类本身不能被实例化,而是用于定义子类所需实现的接口。在定义上来说,跟java里面的interface有异曲同工之妙。

在接触抽象基类之前,我们先看一下,python里面可以怎样控制子类继承某个类之后,要强制重写父类的方法,如果不重写的话,就抛出异常:

class Animail(object):
    def say(self):
        raise NotImplementedError




class Dog(Animail):
    def sayHi(self):
        print("我是一只猫,汪汪汪")




animal = Dog()
animal.say()  # raise NotImplementedError

从以上的脚本可以看出,如果在Dog类中不重写父类的say()方法,则需要在实例化子类对象调用父类的say()方法的时候,才会抛出异常提示。

接下来看一下使用python中的抽象基类是怎么去进行限制的:

import abc


class Animail(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def say(self):
        pass


class Dog(Animail):
    def say(self):
        print("这里是小博测试成长之路的公众号,欢迎大家关注")


    def sayHi(self):
        print("我是一只猫,汪汪汪")


animal = Dog()
animal.say()

当然,上面的代码是可以正常运行的,因为在Dog类中重写了基类Animail的say()方法。

从上面的脚本中,我们要掌握以下几点内容:

1、在Python中,metaclass是一种特殊的类,它用于控制类的创建过程。当定义一个类时,Python解释器会自动查找该类的metaclass,然后使用metaclass来创建类对象。metaclass可以看作是类的模板,它控制了类的创建过程,包括类的属性、方法、继承关系等。因此,class Animail(metaclass=abc.ABCMeta) 这样去定义类的时候,就标识了Animail类是一个抽象基类,抽象基类本身是不能直接被实例化的

Python中的抽象基类介绍_python

2、使用注解@abc.abstractmethod表示定义的方法是抽象方法,抽象方法必须被子类重写。如果不重写的话,在实例化子类对象的时候就会报错:

Python中的抽象基类介绍_python_02

python的抽象基类和java的接口有什么区别?

之前简单的学过一丢丢的java,发现今天学的抽象基类跟java里面的接口所实现的功能是类似的,目前就发现一点区别:

1、抽象基类里面是可以定义非抽象方法的,但是java里面的接口只能定义方法名和参数,是不能有方法的具体实现的。

python:

Python中的抽象基类介绍_java_03

java:

Python中的抽象基类介绍_python_04

当然,可能还有一些其他区别,由于小编才疏学浅,暂时还不能理解透彻,等后面理解透彻了可以再进行补充完善~


标签:Python,python,say,Animail,基类,抽象,metaclass
From: https://blog.51cto.com/u_7739395/6178798

相关文章

  • Python 安装 pyenv
    安装安装到指定位置方便管理pipinstallpyenv-win-i"D:\ProgramFiles\pyenv"配置环境变量查找安装的版本这里我们安装3.11为示例安装后我们在下面的versions目录可以找到Python的程序文件......
  • 【Python】python中的argparse包在解析bool型参数时的细节问题
    1.参数定义定义了如下三个参数,其中use_entity_type和use_entity_id是bool参数。这两个bool型参数的默认值都是True。2.命令行传参这里是vscode中的launch.json文件中的参数定义,想把下面的两个参数修改成False。3.运行过程运行代码,但是发现经过parser.parse_args()之后,参数u......
  • python—numpy库学习
    importnumpyasnparr=np.array([1,2,3])print(arr.shape)print(arr)arr=np.arange(10)print(arr.shape)print(arr)#(开始,截止,步长)#[开始,截止)范围内步长为间隔的更新arr=np.arange(0,10,2.5)print(arr.shape)print(arr)#在一个区间内返回等间距数组arr=np.linspac......
  • Code-C++ Invoke Python
    Code-C++InvokePythonhttps://www.cnblogs.com/yongchao/p/17299892.html使用C或C++扩展Python扩展和嵌入Python解释器Python3.10.11Python/CAPI参考手册Python3.11.3Python/CAPI参考手册https://www.cnblogs.com/lidabo/p/17043302.htmlhttps://bl......
  • OS-Linux-Ubuntu22.04x64-Python-C++调用Python缺少Python.h
    OS-Linux-Ubuntu22.04x64-Python-C++调用Python缺少Python.h使用C或C++扩展Python扩展和嵌入Python解释器Python3.10.11Python/CAPI参考手册Python3.11.3Python/CAPI参考手册参考https://www.cnblogs.com/lidabo/p/17043302.htmlhttps://blog.csdn.net/z......
  • python 十六进制转换字符
    a=b'\xE6\x88\x91\xE6\x98\xAF\xE8\xAF\xB7\xE6\xB1\x82'print(a.decode('utf-8').encode('utf-8'))print(a.decode('gbk').encode('gbk'))print(a.decode(encoding="utf-8",errors="strict......
  • Python的time库
    time库为Python标准库,常用来处理和转换时间。官方文档:time---时间的访问和转换—Python3.11.2文档time.timetime.time()返回一个float类型的时间戳。如下:什么是时间戳?时间戳是自世界协调时(UTC)起始时间1970年1月1日0时0分0秒,即北京时间(UTC+8)1970年1月1日8时0分0秒......
  • Python中将CSV文件转换为H5AD文件
    将CSV文件转换为H5AD文件,可以按照以下步骤进行:使用pandas库将CSV文件读入到Python中,并将其转换为dataframe格式: importpandasaspddf=pd.read_csv('data.csv')使用anndata库将dataframe转换为AnnData对象: importanndataasadadata=ad.AnnData(df)将......
  • python合并多个PPT文件到 文档\演示文稿1.pptx
    #encoding=utf8#-*-coding:utf-8-*-#pipinstallpython-pptx-ihttps://pypi.tuna.tsinghua.edu.cn/simple#pipinstallpython-docx-ihttps://pypi.tuna.tsinghua.edu.cn/simple#pipinstallpandas-ihttps://pypi.tuna.tsinghua.edu.cn/simple#pipinstall......
  • python opencv cv2.putText()显示中文问题
    完整代码如下:(其中cv2AddChineseText为封装代码)importcv2ascvfromPILimportImage,ImageDraw,ImageFontimportnumpyasnp#encoding:utf-8importbase64importrequestsdefcv2AddChineseText(img,text,position,textColor=(0,0,255),textSize=15):if......