Вложенные классы / функции, которые вызывают друг друга и должны наследовать свойства своих родителей
У меня довольно странный сценарий, и я просто не могу найти правильное решение. Я работаю над проектом, который имеет несколько функций для выполнения определенных операций:
- Эти функции взаимосвязаны и должны иметь возможность вызывать друг друга (и наследовать параметры своего родительского объекта).
- Каждая операция должна быть расширяемой и иметь возможность добавлять новые функции.
- Для каждой операции должна быть функция по умолчанию.
Приведу простой пример. Рассмотрим класс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
, хотя. Мысли?