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

时间:2015-01-06 02:53:35

标签: python class dynamic graph dependencies

假设我有以下类:

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)

...

每个字母类基本上都是相应字母函数f_Af_B的包装器。类实例包括状态变量self.last_x以及字母函数被假定为状态依赖(即马尔可夫链类型过程)。

我想要做的是在这些类的实例之间定义依赖关系链,以便尝试不同的功能卷积。例如,如果我们想要计算数字输入值[a, b]上的链x,我们就必须这样做

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

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

目标是使用任意长链进行此操作,同时还能够访问每个中间计算的结果。即如果链是[a, b, c]我也希望得到[a][a, b]的可访问结果(这就是我在当前实现中为每个节点包含一个名称字符串的原因)。

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

到目前为止,我有一个相当苛刻的解决方案,涉及多个字典以跟踪事物,但它感觉不雅,我想我可能会错过一些明显的事情。

1 个答案:

答案 0 :(得分:0)

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

a = A('firstnode')

调用a.calc将尝试调用此实例(因为赋值已替换以前名称a绑定到函数的事实)并且失败。最好是使用更合理的命名。如果由于某种原因不实用,则需要在类定义时在内部绑定函数名称:

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

a=a处理伎俩,等等。

越过了这个障碍,第二个是你希望保存每个类的最后一个结果,但是你不保存它。因此,将代码更改为例如

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

完成后,在类实例列表上执行所需操作是您遇到的最少问题。 E.g

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

之后

[inst.last_result for inst in instances]

将为您提供您正在寻找的中间结果。