У меня есть класс Python, назовем его MyClass
, с несколькими связанными методами.Мне нужно, чтобы поведение одного из этих методов, называемого .dynamic_method()
, было радикально различным в зависимости от значения набора параметров при создании объекта.Будет несколько вариантов dynamic_method
, которые будут разделять очень мало кода между ними, поэтому имеет смысл определять их как отдельные функции / методы, а не как один большой метод с множеством опций и условий.Мне не нужно иметь возможность изменять поведение этого метода после создания объекта, все может быть установлено во время __init__()
.
Для справки MyClass
управляет наборами данных, а .dynamic_method
имеет дело с некоторыми аспектами ввода-вывода этих данных, которые меняются в зависимости от набора данных и контекста.
Это технически не трудно достичь,но ни один из предложенных мною методов не кажется абсолютно правильным:
- Определите варианты метода как функции отдельно и присоедините один из них как связанный метод во время
__init__()
, используя один из методовздесь описано: Добавление метода к существующему экземпляру объекта .Мне кажется, что это наиболее естественный выбор, но многие ответы в этой теме настоятельно не рекомендуют использовать этот шаблон. - Определите все возможные методы в определении класса как
.dynamic_method_a
, .dynamic_method_b
и т. Д.,и установите параметр / псевдоним так, чтобы MyClass.dynamic_method()
вызывал правильный.Это приведет к очень длинному определению класса и большому количеству неиспользуемых методов для каждого объекта. - Сохраните методы как отдельные функции, и
.dynamic_method()
просто вызовет правильную функцию с self
в качестве первого аргумента.,Это похоже на преднамеренное неправильное использование концепции методов и нарушает линирование. - Используйте фабричный шаблон или функцию генератора объектов.Я бы предпочел этого избежать, так как это значительно усложнит кодовую базу.
Что можно было бы назвать наиболее «пифоническим» способом достижения такого поведения?Один из вышеперечисленных методов, или есть очевидная альтернатива, которую я пропустил?