Плохая ли практика использовать пустые классы в качестве контейнеров для методов?

У меня есть несколько функций, которые выполняют одну и ту же задачу, но используют разные алгоритмы. Поскольку все эти алгоритмы связаны (они принадлежат одному и тому же родительскому процессу), я организовал их в своем пакете my_package как методы пустого класса в файле модуля с именем my_empty_class.py следующим образом:

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

Файлы пакета организованы как:

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

Вот как выглядит мой __init__.py:

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
...

Наконец, я вызываю методы с помощью:

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)

Это плохая практика? Потому что это работает, но такое ощущение, что это так. Может быть, есть лучший/более рекомендуемый способ сделать это?

Но зачем вообще нужен этот класс? Если вы удалите класс, вы сможете меньше печатать для вызова своих функций.

quamrana 25.05.2024 15:54

Используйте модули для организации бесплатных функций.

Jonathon Reinhart 25.05.2024 15:54

@quamrana Я объяснил, все функции принадлежат одному родительскому процессу. По этой причине они объединены в один класс.

Gabriel 25.05.2024 15:56

оформите их как @staticmethod, чтобы они имели «фиксированный» тип (function)

cards 25.05.2024 16:08

Из кода, который вы показываете, вы можете просто удалить класс и ввести меньше. Принадлежность к одному и тому же "parent process" не имеет значения.

quamrana 25.05.2024 16:11

если вам подходит пустой класс, используйте его.

furas 25.05.2024 16:18

Это странно, громоздко и ненужно.

John Gordon 25.05.2024 16:33

@JohnGordon, как бы ты организовал посылку? Учитывая, конечно, что модулей и классов больше, чем этот.

Gabriel 25.05.2024 16:39

Габриэль: Важно делать то, что говорит вам @cards. прямо сейчас вы могли бы неправильно использовать сигнатуру метода класса (обычные методы получают объект self, методы класса получают объект cls, а статические методы не получают дополнительного объекта. Вы хотели бы использовать декораторы для класса и статические методы для их идентификации. как таковой, также по соглашению первый символ класса указывается в верхнем регистре, чтобы указать его имя.

LhasaDad 25.05.2024 16:49

По моему мнению, отрицать это из-за того, что вы не согласны с шаблоном, неправильно. Сам вопрос хорош, особенно в том, «как лучше это сделать?» интерпретация. Это полезная вещь для людей, особенно для новичков. Нам нужно прекратить голосовать против и дублировать, закрывая все в небытие, это плохо выглядит для сайта.

ChrisB 25.05.2024 17:22
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
10
65
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Отмечаю, что делать это всем классом ужасно неправильно, но важно делать то, что @cards говорит вам в комментариях.

Вы будете неправильно использовать подпись для метода класса (обычные методы получают объект self, методы класса получают объект cls, а статические методы не получают дополнительного объекта. Вы хотели бы использовать декораторы для класса и статические методы, чтобы идентифицировать их как таковые. .

Также по соглашению первый символ класса указывается в верхнем регистре, что указывает на его имя.

Ответ принят как подходящий

В этом нет необходимости, и вы можете добиться того же, используя меньше кода.

Вместо:

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

писать:

"""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

Вместо:

from .my_empty_class import my_empty_class as my_empty_class

писать:

from . import my_empty_class

(as my_empty_class раньше уже был не нужен.)

Конечно, имя my_empty_class теперь уже не подходит, потому что пустого класса нет, и вам следует найти имя получше, например algorithms.

Один момент, который не рассматривается в этом ответе: если вы хотите иметь несколько отдельных групп свободных методов (что, как я полагаю, и является всей причиной вопроса), используйте отдельные файлы. Вот для чего они нужны. Использование классов для этого просто нелогично. Если его не стоит разделять на файлы, то стоит ли выделять ему отдельные пространства имен?

ChrisB 25.05.2024 17:08

Другие вопросы по теме