Python抽象类(abc模块)
1.抽象类概念
抽象类是一个特殊的类,只能被继承,不能实例化
2.为什么要有抽象类
其实在未接触抽象类概念时,我们可以构造香蕉、苹果、梨之类的类,然后让它们继承水果这个的基类,水果的基类包含一个eat函数。
但是你有没有想过,我们可以将香蕉、苹果、梨实例化,去吃香蕉、苹果、梨。但是我们却不能将水果实例化,因为我们无法吃到叫水果的这个东西。
所以抽象类中只能有抽象方法(没有实现功能),该类不能被实例化,只能被继承,且子类必须实现抽象方法。
3.抽象类的作用
在不同的模块中通过抽象基类来调用,可以用最精简的方式展示出代码之间的逻辑关系,让模块之间的依赖清晰简单。
抽象类的编程,让每个人可以关注当前抽象类的方法和描述,而不需要考虑过多的实现细节,这对协同开发有很大意义,也让代码可读性更高。
有时,我们抽象出一个基类,知道要有哪些方法,但只是抽象方法,并不实现功能,只能继承,
而不能被实例化,但子类必须要实现该方法。看下面的例子:
import abc
class Foo(abc.ABC):
@abc.abstractmethod
def fun(self):
pass
a = Foo()
实例化报错
TypeError: Can't instantiate abstract class Foo with abstract methods fun
下面子类继承该方法
class Sub_foo(Foo):
def f(self):
print('This is sub foo!')
c = Sub_foo()
子类并没有实现fun 方法,实例化子类sub_foo同样报错
TypeError: Can't instantiate abstract class Sub_foo with abstract methods fun
我们在子类实现fun方法:
class Sub_foo(Foo):
def fun(self):
print("From sub_foo")
def f(self):
print('This is sub foo!')
c = Sub_foo()
c.fun()
c.f()
输出:
From sub_foo
This is sub foo!
但是注意,如果这时你实例化Foo,仍然是报错的,因为抽象基类只能继承而不能实例化,子类要实例化
必须先实现该方法。
为了理解抽象基类,你可以这样想,我们有水果这个抽象基类,有苹果,香蕉,桃子类等,但你永远只能
吃得到苹果,桃子这些,而不能吃到所谓的“水果”。