前言
本人是科研小白,在复现别人的代码时看到了在定义方法前一行有一个@abstractmethod,对此感到很疑惑,于是上网查阅了它的用途,总结如下。
一、@abstractmethod介绍
1、@是 Python 中的一个装饰器(decorator),用于定义抽象方法。抽象方法是一种在基类中声明但不进行具体实现的方法,它只定义了方法的接口而没有提供具体的实现代码。
2、使用 @abstractmethod 装饰器可以告诉 Python 解释器,这个方法是一个抽象方法,需要在子类中进行具体的实现。如果一个类中包含了抽象方法,则该类必须被声明为抽象类。
二、代码示例
以下是使用 @abstractmethod 装饰器的一个示例:
from abc import ABC, abstractmethod
class Shape(ABC):
@abstractmethod
def area(self):
pass
@abstractmethod
def perimeter(self):
pass
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14 * self.radius ** 2
def perimeter(self):
return 2 * 3.14 * self.radius
circle = Circle(5)
print(circle.area()) # 输出: 78.5
print(circle.perimeter()) # 输出: 31.4
在上面的例子中,我们定义了一个抽象基类 Shape,其中的 area 和 perimeter 方法被 @abstractmethod 装饰器修饰,表示它们是抽象方法。这意味着任何继承自 Shape 的子类都必须实现这两个方法。
注意,在抽象类中的抽象方法只有方法的声明,没有具体的实现代码。而在子类中,必须提供这些方法的具体实现。
如果某个类继承自抽象类但没有实现其中的所有抽象方法,则该类仍然被视为抽象类,无法实例化。只有在子类中实现了所有抽象方法后,该子类才能被实例化并正常使用。
三、抽象方法和抽象类的设计主要有以下几个目的:
(1)强制规范接口:抽象方法定义了一个类或接口应该具备的基本行为,它们只提供方法的声明而不关注具体实现。通过在抽象类中定义抽象方法,可以强制子类必须实现这些方法,从而确保子类具备一致的接口和行为。
(2)实现多态性:抽象方法和抽象类为多态性提供了基础。通过基类中的抽象方法,可以定义通用的接口,使得不同的子类能够按照自己的方式实现这些方法。利用多态性,我们可以编写更通用、灵活且可扩展的代码。
(3)限制继承关系:抽象类可以作为基类,定义了一组必须实现的方法,这样就限制了继承关系。子类必须提供这些方法的具体实现,以满足继承和多态性的要求。抽象类的设计可以帮助我们限制并规范类之间的继承关系,提高代码的可维护性和可扩展性。
(4)提供默认实现:抽象类中的抽象方法可以有默认的非抽象实现。这样,在子类没有提供自己的实现时,可以使用基类中定义的默认实现。这允许在抽象类中提供一些通用的行为,同时保留了在需要时进行自定义实现的能力。
总之,通过抽象方法和抽象类的设计,我们可以规范接口、实现多态性、限制继承关系,并提供默认实现。这些设计原则有助于编写结构清晰、易于拓展和维护的代码,提高软件的可靠性和可复用性。
提示:本文只是关于@abstractmethod装饰器的简单例子
此外,还有@property装饰器,具体作用和使用方法可以参考我的另一篇博文:@property 装饰器的作用和用法