我有一个问题,解决方案似乎是创建一个类。但是,这个类中的所有方法都是静态的,我只会实例化一次类,所以我想知道使用类是否是正确的方法。
更具体地说,我希望有一个单独的模块来存储一些函数和一些基本上是程序框架的变量。这些函数和变量依赖于定义我的模型的一些参数(我不想将这些参数作为参数传递,因为我可能会在以后指定相关的其他原因)。例:
# my_model.py
def V(x):
return -m*x**2 + k*x**4
在另一个模块上,我扫描了这些参数“m”和“k”的某些值,并且对于这些值中的每一个,我想要找到V的最小值:
# scan.py
from scipy.optimize import minimize
import random, my_model
for i in range(5):
m = random.randint(0,10)
k = random.randint(0,10)
minimize(my_model.V, 0)
当然,这不起作用,因为my_model.V不知道m和k是什么。正如我所说,我考虑在my_model文件中创建一个类,在该类中定义函数V(和其他!),并在scan.py中实例化类,并将参数“m”,“k”作为参数传递。但是,正如我所说,这听起来像是过度使用了课程特征。例如,显然上面的函数V是静态的,因此在该类中的所有其他定义也会发生。那么有没有其他更合适的方式来实现我想要的,或者我只是“过度反应”和/或完全误解了Python中类的使用?
答案 0 :(得分:2)
您可以使用functools.partial
:
# my_model.py
def V(m, k, x):
return -m*x**2 + k*x**4
并像这样使用它:
# scan.py
import functools
from scipy.optimize import minimize
import random, my_model
for i in range(5):
m = random.randint(0,10)
k = random.randint(0,10)
minimize(functools.partial(my_model.V, m, k), 0)
这实际上只是作为课程的替代品。这里的口味有所不同,有些人建议你真的应该这样做。对于不同的模型函数使用类和@classmethod
s也适合我。
答案 1 :(得分:2)
我不确定我是否正确理解你的问题,但我想我会做的是:
1)制作V
的m和k参数def V(x, m, k):
return -m*x**2 + k*x**4
2)你希望最小化关于x的V的时刻,对于固定的m和k,创建一个已经设置了m和k的部分函数,并最小化:
from functools import partial
for i in range(5):
m = random.randint(0, 10)
k = random.randint(0, 10)
V_with_fixed_m_k = partial(V, m=m, k=k)
minimize(V_with_fixed_m_k, 0)
或者,创建一个函数,返回使用右m和k的V版本:
def parameterized_V(m, k):
def V(x):
return -m*x**2 + k*x**4
return V
但这基本上只是对于V。
重新实现functools.partial