2

我有一个问题,解决方案似乎是创建一个类。但是,这个类中的所有方法都是静态的,我只会实例化一次类,所以我想知道使用类是否是正确的方法。

更具体地说,我希望有一个单独的模块来存储本质上是程序骨架的一些函数和一些变量。这些函数和变量取决于定义我的模型的一些参数(并且我不想将这些参数作为参数传递,因为我可能会在以后指定相关的其他原因)。前任。:

# 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 中类的使用?

4

2 回答 2

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 对我来说也很好。

于 2014-01-12T15:04:38.407 回答
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 的重新实现。

于 2014-01-12T15:05:30.747 回答