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类是一个抽象基类,抽象基类本身是不能直接被实例化的

8d7f50edf408cb643a74a95efce192b3.png

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

2c6fe987d6da5599706f8758cb53e550.png

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

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

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

python:

289619ae252df5fb84ee8a504fbd7f2b.png

java:

e57ac36526f4f721629e68f918a844ee.png

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

点击上面文字添加关注!推荐指数★★★★★

 最近准备组建各种打卡学习,有兴趣的小伙伴可以微信(xiaobotester)私聊一起学习。

猜你喜欢

转载自blog.csdn.net/liboshi123/article/details/129920395