我在python中创建了一个工作模拟,其编写如下:
alpha = 5
def f(x):
"""
Returns value from function
"""
return alpha*x**2
def g(x):
"""
Returns another value
"""
return f(10)*alpha + 4
它的问题是,每次我有其他alpha我必须编辑文件。为了避免这种情况,我试图使用类,编辑的代码是:
class Myclass():
def __init__(self,alpha):
"""
Asign alpha for class instance
"""
self.alpha = alpha
def f(self,x):
"""
Returns value from function
"""
alpha = self.alpha
return alpha*x**2
def g(self,x):
"""
Returns another value
"""
alpha = self.alpha
f = self.f
return f(10)*alpha + 4
可以用作:
inst = Myclass(4)
inst.g(5) # Getting the function value
inst.f(5) # Also testing of used functions is needed
期望的行为是什么。
问题在于我必须以下列方式编辑我的工作模拟代码:
如何避免这些编辑?也许有一些装饰师可以做我想要达到的目标?
在这种情况下,额外的关键字参数并不方便,因为我需要从函数到函数跟踪这些参数。通常它可以将代码嵌套在另一个函数中,但在这个时候我明确需要速度和测试。
我几乎得到了我希望如何使用我的工作模拟的行为。经过长时间在谷歌搜索后,我记得在py Classes
中以某种方式介绍了Modules
。因此我想用它作为某种对象。
首先,我将我的模拟单独留在一个名为mymodule.py
的文件中,我将其用作另一个文件中的模块:
class Myclass():
def __init__(self,alpha):
"""
Asign alpha for class instance
"""
import mymodule
mymodule.alpha = alpha
self.f = mymodule.f
self.g = mymodule.g
与给定的例子一起使用。然而,它引发了一种不受欢迎的行为:
inst = Myclass(5)
inst.g(5)
# 2504
inst_another = Myclass(6)
inst.g(5)
# 3604
或仅仅Class
实例不是独立的。有办法解决这个问题吗?
答案 0 :(得分:0)
将alpha
作为参数传递给两个函数。在这种情况下,我给alpha
一个默认值5
,但这不是必需的。如果需要,您可以使用x, alpha
定义这两个函数。
def f(x, alpha=5):
"""
Returns value from function
"""
return alpha*x**2
def g(x, alpha=5):
"""
Returns another value
"""
return f(10)*alpha + 4
使用默认alpha值5的示例:
>>> g(5)
2504
>>> f(5)
125
另一个地方,g()
的alpha为2,f()
为1:
>>> g(5, alpha=2)
1004
>>> f(5, 1)
25
如果你有很多alphas
>>> alpha_list = [7, 11, 13, 2, 1, 3, 5, 14, 4, 0, 6, 10, 9, 12, 8]
>>> [(f(5, x), g(5, x)) for x in alpha_list]
[(175, 3504),
(275, 5504),
(325, 6504),
(50, 1004),
(25, 504),
(75, 1504),
(125, 2504),
(350, 7004),
(100, 2004),
(0, 4),
(150, 3004),
(250, 5004),
(225, 4504),
(300, 6004),
(200, 4004)]
答案 1 :(得分:0)
如果它有帮助,你就不必为#c;从Myclass对象分配局部变量的值"
class Myclass():
def __init__(self,alpha):
self.alpha = alpha
def f(self,x):
return self.alpha*x**2
def g(self,x):
return self.f(10)*self.alpha + 4
答案 2 :(得分:0)
您可能拥有将两个参数都作为参数
的函数def realf(x, alpha):
"""
Returns value from function
"""
return alpha*x**2
然后你可以设置默认alpha
,这样它就像一个带有一个参数的函数。
f5 = functools.partial(realf, alpha = 5)
...
f7 = functools.partial(realf, alpha = 7)