2

我有一个相当奇怪的场景,我无法理解正确的解决方案。我正在开发一个具有多种功能来执行某些操作的项目:

  • 这些函数是相互关联的,需要能够相互调用(并继承其父对象的参数)。
  • 每个操作都应该是可扩展的,并且能够添加新功能。
  • 每个操作都应该有一个默认函数。

让我举一个简单的例子。考虑一个mymath可以执行add和的类multiplymultiply可以通过简单的乘法或通过迭代调用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-04eval从示例中删除了调用。我不知道使用getattr. 我仍然不确定如何处理范围问题。

编辑 2020-05-05我把事情分成子类。这更符合我的最终目标。将向用户提供_N要扩展的类,并且代码将mymath在运行时包含在我的主类中。

不过,我仍然无法找到解决范围界定问题的好方法obj。想法?

4

0 回答 0