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_A
、f_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]
将为您提供所需的中间结果。
假设我有以下 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_A
、f_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]
将为您提供所需的中间结果。