Search code examples
pythonclass

Is it bad practice to use empty classes as containers for methods?


I have a few functions that do basically the same task but using different algorithms. Since these algorithms are all related (they belong to the same parent process) I've organized them in my package my_package as methods of an empty class in a module file called my_empty_class.py as so:

class my_empty_class:
    """Define an empty class to hold the methods"""

    def func1(param1, param2, param3):
        # algo 1
        return results

    def func2(param1, param3):
        # algo 2
        return results

    def func3(param2, param4):
        # algo 3
        return results

The package files are organized as:

my_package/
    __init__.py
    my_empty_class.py
    another_module.py
    onemore_module.py
    ...

This is what my __init__.py looks like:

from .my_empty_class import my_empty_class as my_empty_class
from .another_module import another_module as another_module
from .onemore_module import onemore_module as onemore_module
...

Finally, I call the methods with:

import my_package

res1 = my_package.my_empty_class.func1(param1, param2, param3)
res2 = my_package.my_empty_class.func2(param1, param3)
res3 = my_package.my_empty_class.func3(param2, param4)

Is this bad practice? Because it works, but it feels like it is. Is there maybe a better/more recommended way to go about this?


Solution

  • It's just unnecessary and you can achieve the same with less code.

    Instead of:

    class my_empty_class:
        """Define an empty class to hold the methods"""
    
        def func1(param1, param2, param3):
            # algo 1
            return results
    
        def func2(param1, param3):
            # algo 2
            return results
    
        def func3(param2, param4):
            # algo 3
            return results
    

    write:

    """A module to hold the functions"""
    
    def func1(param1, param2, param3):
        # algo 1
        return results
    
    def func2(param1, param3):
        # algo 2
        return results
    
    def func3(param2, param4):
        # algo 3
        return results
    

    Instead of:

    from .my_empty_class import my_empty_class as my_empty_class
    

    write:

    from . import my_empty_class
    

    (as my_empty_class was already unnecessary before.)

    Of course, the name my_empty_class now does not fit anymore, because there is no empty class, and you should find a better name, like algorithms.