0
点赞
收藏
分享

微信扫一扫

Python中的抽象基类介绍


    从上一篇文章(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中的抽象基类介绍_java_02

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

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

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

python:

Python中的抽象基类介绍_java_03

java:

Python中的抽象基类介绍_开发语言_04

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


举报

相关推荐

0 条评论