Search code examples
pythonabstract-class

What is the point of an @abstractmethod with default implementation?


I’ve seen code that declares abstract methods that actually have a non-trivial body.

What is the point of this since you have to implement in any concrete class anyway?

Is it just to allow you to do something like this?

   def method_a(self):
          super(self).method_a()

Solution

  • I've used this before in cases where it was possible to have the concrete implementation, but I wanted to force subclass implementers to consider if that implementation is appropriate for them.

    One specific example: I was implementing an abstract base class with an abstract factory method so subclasses can define their own __init__ function but have a common interface to create them. It was something like

    class Foo(ABC):
        def __init__(self, a, b, c):
            self.a = a
            self.b = b
            self.c = c
    
        @classmethod
        @abstractmethod
        def from_args(cls, a, b, c) -> "Foo":
            return cls(a, b, c)
    

    Subclasses usually only need a subset of the arguments. When testing, it's cumbersome to access the framework which actually uses this factory method, so it's likely someone will forget to implement the from_args factory function since it wouldn't come up in their usual testing. Making it an abstractmethod would make it impossible to initialize the class without first implementing it, and will definitely come up during normal testing.