Python 动态生成 class 个实例之间的依赖关系

Python dynamically generate dependencies between class instances

假设我有以下 classes:

class base(object):
  def __init__(self, name):
    self.name = name
    self.last_x = 0.0
  def calc(self, x):
    return x

class A(base):
  def calc(self, x):
    return f_A(x)

class B(base):
  def calc(self, x):
    return f_B(x)

...

每个带字母的 classes 基本上都是对应带字母的函数 f_Af_B 的包装器。 class 实例包括一个状态变量 self.last_x 以及假设字母函数是状态相关的(即马尔可夫链类型过程)。

我想做的是在这些 classes 的实例之间定义依赖链,以便尝试不同的函数卷积。例如,如果我们想在数字输入值 x 上计算链 [a, b],我们将不得不做

a = A('firstnode')
b = B('secondnode')

res = b.calc(a.calc(x))

我们的目标是用任意长的链来做到这一点,同时还能够访问每个中间计算的结果。 IE。如果链是 [a, b, c] 我也想使 [a][a, b] 的结果可访问(这就是为什么我在当前实现中为每个节点包含一个名称字符串)。

为此用例设置我的 classes 和数据结构的正确方法是什么?

到目前为止,我有一个相当笨拙的解决方案,涉及多个词典来跟踪事物,但感觉不够优雅,我想我可能会遗漏一些明显的东西。

不幸的是,您不正确地重用了名称(因此隐藏了它们以前的值)。例如,之后:

a = A('firstnode')

调用 a.calc 将尝试调用此实例(因为赋值已经取代了以前名称 a 绑定到函数的事实)并失败。最好是使用更明智的命名。如果出于某种原因这不切实际,您需要在 class 定义时在内部绑定函数名称:

class A(base):
    def calc(self, x, a=a):
        return a(x)

a=a 的作用等等。

通过了这个障碍,第二个是你想要保存每个 class 的最后一个结果,但是,你没有保存它。因此,将代码更改为例如

class A(base):
    def calc(self, x, a=a):
        self.last_result = a(x)
        return self.last_result

完成后,对 class 个实例的列表执行所需的操作是您遇到的最少问题。例如

def doit(instances, x):
    curr = x
    for inst in instances: curr=inst.calc(curr)
    return curr

此后

[inst.last_result for inst in instances]

将为您提供所需的中间结果。