从上一篇文章(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类是一个抽象基类,抽象基类本身是不能直接被实例化的。
2、使用注解@abc.abstractmethod表示定义的方法是抽象方法,抽象方法必须被子类重写。如果不重写的话,在实例化子类对象的时候就会报错:
python的抽象基类和java的接口有什么区别?
之前简单的学过一丢丢的java,发现今天学的抽象基类跟java里面的接口所实现的功能是类似的,目前就发现一点区别:
1、抽象基类里面是可以定义非抽象方法的,但是java里面的接口只能定义方法名和参数,是不能有方法的具体实现的。
python:
java:
当然,可能还有一些其他区别,由于小编才疏学浅,暂时还不能理解透彻,等后面理解透彻了可以再进行补充完善~