Вложенные классы / функции, которые вызывают друг друга и должны наследовать свойства своих родителей

У меня довольно странный сценарий, и я просто не могу найти правильное решение. Я работаю над проектом, который имеет несколько функций для выполнения определенных операций:

  • Эти функции взаимосвязаны и должны иметь возможность вызывать друг друга (и наследовать параметры своего родительского объекта).
  • Каждая операция должна быть расширяемой и иметь возможность добавлять новые функции.
  • Для каждой операции должна быть функция по умолчанию.

Приведу простой пример. Рассмотрим классmymath который может выполнять add а также multiply. multiply может выполняться простым умножением или итеративным вызовом add функция (представим, что +не существует, чтобы продемонстрировать требование, чтобы функции могли вызывать друг друга). Вот пример использования вложенных классов:

class addition_N:
    def add(self, obj):
        result = obj.param1 + obj.param2
        return result

class multiply_N:
    def multiply(self, obj):
        return obj.param1 * obj.param2

    def mult_loop(self, obj):
        param1 = obj.param1
        obj.param1 = 0

        for i in range(param1):
            obj.param1 = getattr(mymath.addition, 'add')(self, obj=obj)

        return obj.param1

class mymath:
    def __init__(self, param1, param2):
        self.param1 = param1
        self.param2 = param2

    class multiply(multiply_N):
        def __new__(cls, obj, func="multiply"):
            return getattr(cls, func)(cls, obj=obj)

    class addition(addition_N):
        def __new__(cls, obj, func="add"):
            return getattr(cls, func)(cls, obj=obj)


math = mymath(param1=2, param2=3)
mult = math.multiply(math, func='multiply')

math = mymath(param1=2, param2=3)
mult_loop = math.multiply(math, func='mult_loop')

math = mymath(param1=2, param2=3)
add = math.addition(math, func='add')

print(mult)
print(mult_loop)
print(add)

(Пожалуйста, не убивайте меня за использование __new__. В моем фактическом коде проекта есть несколько условных операторов для обработки различных сценариев. Если у вас есть предложения по другим альтернативам Pythonic, дайте мне знать - я могу изменить их в соответствии со своими потребностями).

Код легче расширять, но у меня есть проблема с масштабом. Чтобы решить проблему с областью видимости, я передаю весь объект,obj, до каждой функции. Это работает, но беспорядочно. (Прежде чем предлагать мне просто скопировать параметры родительской функции и создать экземпляры новых объектов, мой фактический проект довольно сложен, имеет МНОГО параметров, а это убьет производительность).

Что мне здесь не хватает? Я чувствую, что прямо у меня под носом есть простое решение, но я так долго смотрел на свой код, что не могу его понять.

РЕДАКТИРОВАТЬ 2020-05-04 Я удалилevalзвонки из моего примера. Я не знал об использованииgetattr. Я до сих пор не знаю, как справиться с проблемой определения объема.

РЕДАКТИРОВАТЬ 2020-05-05 Я разбил вещи на подклассы. Это больше соответствует моей конечной цели. Пользователям будет предоставлен_N классы для расширения, и код будет включен в мой основной mymath класс во время выполнения.

Я до сих пор не могу придумать хороший способ обойти проблему с областью видимости с помощью obj, хотя. Мысли?

0 ответов

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