31.Python中的抽象类 (Abstract Class)

《Python编程的术与道:Python语言进阶》视频课程
《Python编程的术与道:Python语言进阶》视频课程链接:https://edu.csdn.net/course/detail/28618

抽象类 (Abstract Class)

抽象类是包含一个或多个抽象方法的类。 抽象方法是已声明但不包含任何实现的方法。 抽象类无法实例化,并且需要子类来提供抽象方法的实现。

首先是一个不是抽象类的例子:

class AbstractClass:
    
    def do_something(self):
        pass
    
class B(AbstractClass):
    pass

a = AbstractClass()
b = B()

如果启动此程序,我们会发现这并不是一个抽象类,因为:

  • 我们可以从AbstractClass实例化一个实例

  • 我们不需要在B的类定义中实现do_something

我们的示例实现了一个简单继承的情况,这种情况与抽象类无关。 实际上,Python本身并不提供抽象类。 但是,Python附带了一个模块,该模块提供了用于定义抽象基类(ABC,Abstract Base Class)的基础结构。此模块称为abc。

以下Python代码使用abc模块并定义了一个抽象基类:

from abc import ABC, abstractmethod
 
class AbstractClassExample(ABC):
    
    def __init__(self, value):
        self.value = value
        super().__init__()
    
    @abstractmethod
    def do_something(self):
        pass

现在,我们将使用先前定义的抽象类定义一个子类。你会注意到,即使需要实现do_something方法,我们也没有实现它,因为该方法被装饰器"abstractmethod"装饰为一个抽象方法。

下面的例子中我们收到一个无法实例化DoAdd35的异常:

class DoAdd35(AbstractClassExample):
    pass

x = DoAdd35(6)
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

 in 
      2     pass
      3 
----> 4 x = DoAdd35(6)


TypeError: Can't instantiate abstract class DoAdd35 with abstract methods do_something

在下面的示例中,我们定义了两个从抽象类继承的类,并以正确的方式进行操作,

class DoAdd35(AbstractClassExample):

    def do_something(self):
        return self.value + 35
    
class DoMul35(AbstractClassExample):
    
    def do_something(self):
        return self.value * 35
    
x = DoAdd35(10)
y = DoMul35(10)

print(x.do_something())
print(y.do_something())
45
350

注意:除非所有抽象方法都被重写,否则不能实例化从一个抽象类派生的类。

你可能会认为抽象方法无法在抽象基类中实现。 这种印象是错误的:抽象方法在抽象类中可以具有实现! 即使实现,子类的设计人员也将被迫重写实现。 像在其他常规继承情况下一样,可以使用super()调用机制来调用abstract方法。 这使得可以在abstract方法中提供一些基本功能,这些功能可以通过子类实现来丰富。

from abc import ABC, abstractmethod
 
class AbstractClassExample(ABC):
    
    @abstractmethod
    def do_something(self):
        print("Some implementation!")
        
class AnotherSubclass(AbstractClassExample):

    def do_something(self):
        super().do_something()
        print("The enrichment from AnotherSubclass")
        
x = AnotherSubclass()
x.do_something()
        
Some implementation!
The enrichment from AnotherSubclass

你可能感兴趣的:(Python语言进阶,python)