一步一步学python之(16)面向对象(抽象类和接口)
在Python中,抽象类和接口是用于定义类的规范和约束的机制,它们不能被实例化,只能被继承和实现。抽象类可以包含具体的方法和属性,但是至少有一个抽象方法。抽象类用于定义一组相关的类的公共接口供子类继承,子类必须实现抽象方法。
接口是一个纯粹的抽象类,它只定义了一组抽象方法,没有具体的方法实现和属性。接口用于定义子类的行为规范,子类必须实现接口中定义的所有方法。
在Python中,可以使用abc模块来定义抽象类,抽象方法必须用abstractmethod来装饰。
1. 抽象类
**抽象类可以包含具体的方法和属性,但是至少有一个抽象方法。**抽象类用于定义一组相关的类的公共接口供子类继承,子类必须实现抽象方法。抽象类用于定义一组相关的类的公共接口供子类继承,子类必须实现抽象方法。相当于给方法指定了一套规则(方法名称和参数都指定好了)
如何创建抽象类和抽象方法呢?
导入abc模块:首先,你需要从abc模块导入ABC和abstractmethod。
定义抽象基类:通过继承ABC类来创建抽象基类(继承上一节内容我们都已经介绍过了)。
定义抽象方法:使用@abstractmethod装饰器来标记抽象方法,用法感觉和java中的注解方式差不多。
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def jiao_sheng(self):
pass
class Dog(Animal):
def jiao_sheng(self):
return "汪汪!"
class Cat(Animal):
def jiao_sheng(self):
return "喵喵!"
# animal = Animal() # 这将抛出,说明不能创建抽象类的实例
dog = Dog()
print(dog.jiao_sheng())
cat = Cat()
print(cat.jiao_sheng())
在上面的例子中,Animal是一个抽象基类,它定义了一个抽象方法jiao_sheng(汉语拼音O(∩_∩)O哈哈~)。Dog和Cat类继承自Animal并提供了jiao_sheng方法的具体实现。如果我们尝试直接实例化Animal,将会抛出TypeError,因为它是抽象的,不能被实例化。
指导了抽象类我们来总结下 和我们上节部分介绍的普通的类有什么区别呢?相信你已经非常清楚了。
特性 | 抽象类 | 普通类 |
---|---|---|
是否可以实例化 | 否 | 是 |
方法类型要求 | 可包含抽象方法和具体方法 | 仅包含具体方法,不能包含抽象方法 |
子类要求 | 子类必须实现父类中所有抽象方法 | 无要求 |
2.接口
在python中,其实抽象类和接口没有严格的定义区分,其实接口也可以通过抽象类变相的表示,比如抽象类中有且仅有抽象方法时就可以看做是一个接口。如果抽象类中还有具体的方式是,就不能看做这接口,直白一点就是,接口中的所有方法必须都是抽象的,而抽象类中至少有一个抽象方法,可以有任意个具体的方法。
例如定义一个接口如下:
from abc import ABC, abstractmethod
class IShape(ABC):
@abstractmethod
def area(self):
pass
@abstractmethod
def perimeter(self):
pass
接口中的两个方法都是抽象的(@abstractmethod修饰),并且没有具体实现的方法,所以可以认为就是一个接口。
更加详细抽象类内容介绍可以参考官网的abc — 抽象基类