У меня есть несколько функций, которые выполняют одну и ту же задачу, но используют разные алгоритмы. Поскольку все эти алгоритмы связаны (они принадлежат одному и тому же родительскому процессу), я организовал их в своем пакете 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 Я объяснил, все функции принадлежат одному родительскому процессу. По этой причине они объединены в один класс.
оформите их как @staticmethod, чтобы они имели «фиксированный» тип (function)
Из кода, который вы показываете, вы можете просто удалить класс и ввести меньше. Принадлежность к одному и тому же "parent process" не имеет значения.
если вам подходит пустой класс, используйте его.
Это странно, громоздко и ненужно.
@JohnGordon, как бы ты организовал посылку? Учитывая, конечно, что модулей и классов больше, чем этот.
Габриэль: Важно делать то, что говорит вам @cards. прямо сейчас вы могли бы неправильно использовать сигнатуру метода класса (обычные методы получают объект self, методы класса получают объект cls, а статические методы не получают дополнительного объекта. Вы хотели бы использовать декораторы для класса и статические методы для их идентификации. как таковой, также по соглашению первый символ класса указывается в верхнем регистре, чтобы указать его имя.
По моему мнению, отрицать это из-за того, что вы не согласны с шаблоном, неправильно. Сам вопрос хорош, особенно в том, «как лучше это сделать?» интерпретация. Это полезная вещь для людей, особенно для новичков. Нам нужно прекратить голосовать против и дублировать, закрывая все в небытие, это плохо выглядит для сайта.






Отмечаю, что делать это всем классом ужасно неправильно, но важно делать то, что @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.
Один момент, который не рассматривается в этом ответе: если вы хотите иметь несколько отдельных групп свободных методов (что, как я полагаю, и является всей причиной вопроса), используйте отдельные файлы. Вот для чего они нужны. Использование классов для этого просто нелогично. Если его не стоит разделять на файлы, то стоит ли выделять ему отдельные пространства имен?
Но зачем вообще нужен этот класс? Если вы удалите класс, вы сможете меньше печатать для вызова своих функций.