假设我有以下类:
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_A
,f_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]
的可访问结果(这就是我在当前实现中为每个节点包含一个名称字符串的原因)。
为此用例设置我的类和数据结构的正确方法是什么?
到目前为止,我有一个相当苛刻的解决方案,涉及多个字典以跟踪事物,但它感觉不雅,我想我可能会错过一些明显的事情。
答案 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]
将为您提供您正在寻找的中间结果。