探秘Python抽象类
在那篇探讨Python接口与“鸭类型”关系的文章中(Python中接口与鸭类型),我们详细介绍了Python中接口的实现方式--鸭类型。尽管“鸭类型”仅作为接口的一种实现策略,并不具备像Java等其他语言中的强制实现检查功能,且甚至需要借助hasattr函数来检验所需的方法是否存在,为此Python引入了abc模块以解决此类难题。该模块为构建抽象基类提供了有力支持。
抽象类主要用于制定规范,而非实际对象创建。它用于设定实现类(或子类)所需拥有的属性或方法,而自身并无实现责任。
抽象类详解
Python 中使用 abc 模块来实现抽象类的功能,其中模块中 ABC 作为抽象基类,抽象类需要继承该类。
abc.abstractmethod 用来定义抽象方法,表示子类必须要实现的方法。
使用property 和abc.abstractmethod 两个装饰器来定义抽象属性, 表示子类必须要实现定义的属性。
我们使用代码来解释:
from abc import ABC, abstractmethod
# ---------------------------------抽象类
# 定义抽象基类User
# 继承ABC
class User(ABC):
# 定义属性
@property
@abstractmethod
def age(self): pass
# 定义初始化函数
def __init__(self, name):
self._name = name
# 定义抽象方法
@abstractmethod
def print_name(self): pass
# --------------------------------实现类
# 定义继承抽象类的Manager
class Manager(User):
# 必须设置属性
@property
def age(self):
return 20
# 定义初始化函数
def __init__(self, name):
super().__init__(name)
# 必须实现的方法
def print_name(self):
print(f"我的名字叫: {self._name}")
# 实例化Manager
m = Manager("小明")
# 调用方法
m.print_name()
# 我的名字叫: 小明
在上述代码中, 我们定义了User 抽象类(继承自 ABC),并且定义了age 抽象属性和print_name 抽象方法,Manager 作为其实现类,分别实现了 age 属性和print_name 两个方法。
注意点
- 如果使用 pycharm 开发, 当一个类继承了一个抽象类,则会提示需要实现的方法, 只需要点击蓝色字,就可直接生成代码,非常方便(示例)。
- 继承了抽象类的子类, 如果没有或没有完全实现所有的方法,则继承的类依然是抽象类,且不能实例化。