fromabcimportABC,abstractmethodclassBasePlugin(ABC):"""Base class for our plugin."""@abstractmethoddefexecute(self,x:int,y:int)->int:"""Plugin performs operation on two integers and returns integer."""
fromabcimportABC,abstractmethodclassBasePlugin(ABC):"""Base class for our plugin."""@abstractmethoddefexecute(self,x:int,y:int)->int:"""Plugin performs operation on two integers and returns integer."""
In this module, we define an abstract class. It does not provide an actual implementation
but rather specifies an interface. The established practice in Python is to derive
such classes from ABC and mark the required parts with @abstractmethod.
fromabcimportABC,abstractmethodclassBasePlugin(ABC):"""Base class for our plugin."""@abstractmethoddefexecute(self,x:int,y:int)->int:"""Plugin performs operation on two integers and returns integer."""
Define a base class for our plugins. We have no particular requirements,
so we can derive it from ABC to mark this class is abstract.
fromabcimportABC,abstractmethodclassBasePlugin(ABC):"""Base class for our plugin."""@abstractmethoddefexecute(self,x:int,y:int)->int:"""Plugin performs operation on two integers and returns integer."""
Though docstrings are advisory, it will help to navigate our code,
so describe plugin tasks and features.
fromabcimportABC,abstractmethodclassBasePlugin(ABC):"""Base class for our plugin."""@abstractmethoddefexecute(self,x:int,y:int)->int:"""Plugin performs operation on two integers and returns integer."""
The @abstractmethod decorator indicates that a method must be implemented in derived classes.
fromabcimportABC,abstractmethodclassBasePlugin(ABC):"""Base class for our plugin."""@abstractmethoddefexecute(self,x:int,y:int)->int:"""Plugin performs operation on two integers and returns integer."""
Our main function of the plugin, do not to forget to place the proper type hints to allow
static type checking.
fromabcimportABC,abstractmethodclassBasePlugin(ABC):"""Base class for our plugin."""@abstractmethoddefexecute(self,x:int,y:int)->int:"""Plugin performs operation on two integers and returns integer."""
The main function of the plugin already should be documented.
Then let's create a loader instance. You need only one loader instance per each type for your application. So loaders are usually singletons.
Loader is the generic type, so we must pass the exact plugin type. In the subclass scheme
plugins are classes, derived from the BasePlugin class. In Python's typing terms,
the subclass of BasePlugin has the Type[BasePlugin] type. We'd placed the type into
the brackets just after the Loader.
After defining the plugin's type, we need to initialize the loader itself.
Loader has several initialization parameters, see Reference
for details. Here we consider our plugins will be in plugins folder of our applications.
Loader returns the class. We create the instance to show we can use some plugin initialization
tasks. We can also define the execute method as a @classmethod to skip
the initialization step.