在 类 in Python 中将带有参数参数的函数存储为实例
Storing Functions with parameter arguments as instances in Classes in Python
我正在尝试设置一个 class,我可以在其中定义一个可以具有任意数量参数的函数 G(.)。下面的代码显示了 G(rij) 的默认设置,然后可以在 get_k() 和 get_y() 中使用。但是,我现在定义了第二个函数 G_ln(rij, a, c, s),它接受任意数量的参数。 class 已经定义了变量“a”。如何以最佳方式构造此代码,以便将参数存储在 class 中或可传递给任意 G.
的函数
下面的代码自然会产生错误,因为未定义“a”、“c”和“s”。这只是完整代码的示例,其中 get_y() 和 get_k() 也用于其他函数,因此我希望以一般方式传入参数。
class Tree:
def __init__(self, a, sigma, j, dt):
self.a = a
self.sigma = sigma
self.j = j
self.dt = dt
def set_G(self, G=lambda r: np.where(r < -0.01, 0.2, 0)):
self.G = G
def get_k(self, rij, ri0):
t1 = (self.G(rij) - self.G(ri0)) * self.dt / self.dx
return np.floor(self.j + t1 + 1/2)
def get_y(self, rij, ri0):
k = self.get_k(rij, ri0)
t1 = (self.G(rij) - self.G(ri0)) * self.dt / self.dx
return self.j + t1 - k
def G_ln(rij, a, c, s):
if rij < np.log(s):
val = -a * c * x / (np.exp(x) + c - s)
else:
val = - a * x
return val
a = 0.25
s = 0.02
sigma = 0.3
c = 0.03
lda = -0.12
rij = np.array([-0.01310713, -0.00444688, 0.00421338])
ri0 = rij[1]
test = Tree(a, sigma, j = [-1, 0, 1], dt=0.25)
test.set_G(G=G_ln)
k = test.get_k(rij, ri0)
y = test.get_y(rij, ri0)
也许按照这些思路是解决方案?但是,不一定需要任何额外的参数。
def set_G(self, G, args):
self.G = lambda rij: G(rij, *args)
与其将这种复杂性推入您的 Tree
class,我只想在设置 G
时绑定额外的参数:
test.set_G(lambda r: G_ln(r, a, c, s))
理论上,如果这些值只被 G
使用,G
应该是跟踪它们的东西。
我正在尝试设置一个 class,我可以在其中定义一个可以具有任意数量参数的函数 G(.)。下面的代码显示了 G(rij) 的默认设置,然后可以在 get_k() 和 get_y() 中使用。但是,我现在定义了第二个函数 G_ln(rij, a, c, s),它接受任意数量的参数。 class 已经定义了变量“a”。如何以最佳方式构造此代码,以便将参数存储在 class 中或可传递给任意 G.
的函数下面的代码自然会产生错误,因为未定义“a”、“c”和“s”。这只是完整代码的示例,其中 get_y() 和 get_k() 也用于其他函数,因此我希望以一般方式传入参数。
class Tree:
def __init__(self, a, sigma, j, dt):
self.a = a
self.sigma = sigma
self.j = j
self.dt = dt
def set_G(self, G=lambda r: np.where(r < -0.01, 0.2, 0)):
self.G = G
def get_k(self, rij, ri0):
t1 = (self.G(rij) - self.G(ri0)) * self.dt / self.dx
return np.floor(self.j + t1 + 1/2)
def get_y(self, rij, ri0):
k = self.get_k(rij, ri0)
t1 = (self.G(rij) - self.G(ri0)) * self.dt / self.dx
return self.j + t1 - k
def G_ln(rij, a, c, s):
if rij < np.log(s):
val = -a * c * x / (np.exp(x) + c - s)
else:
val = - a * x
return val
a = 0.25
s = 0.02
sigma = 0.3
c = 0.03
lda = -0.12
rij = np.array([-0.01310713, -0.00444688, 0.00421338])
ri0 = rij[1]
test = Tree(a, sigma, j = [-1, 0, 1], dt=0.25)
test.set_G(G=G_ln)
k = test.get_k(rij, ri0)
y = test.get_y(rij, ri0)
也许按照这些思路是解决方案?但是,不一定需要任何额外的参数。
def set_G(self, G, args):
self.G = lambda rij: G(rij, *args)
与其将这种复杂性推入您的 Tree
class,我只想在设置 G
时绑定额外的参数:
test.set_G(lambda r: G_ln(r, a, c, s))
理论上,如果这些值只被 G
使用,G
应该是跟踪它们的东西。