我真的需要上课吗?

2024-04-25 17:18:15 发布

您现在位置:Python中文网/ 问答频道 /正文

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

更具体地说,我希望有一个单独的模块来存储一些函数和一些变量,这些基本上是程序的框架。这些函数和变量依赖于定义我的模型的一些参数(由于其他原因,我不想将这些参数作为参数传递,如果相关的话,我可能会在后面指定这些参数)。例如:

# 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)

当然,这是行不通的,因为我的模型V不知道m和k是什么。如前所述,我考虑过在my\ model文件中创建一个类,定义函数V(以及其他!)并在中实例化该类扫描.py将参数“m”、“k”作为参数传递。但是,正如我所说的,我觉得这是对类特性的过度使用。例如,上面的函数V显然是静态的,这个类中的所有其他定义也是静态的。那么,有没有其他更合适的方法来实现我想要的,或者我只是“反应过度”和/或完全误解了Python中类的使用?你知道吗


Tags: 模块实例方法函数py模型import参数
2条回答

我不确定我是否正确理解了你的问题,但我想我应该做的是:

1)确定V的m和k参数

def V(x, m, k):
    return -m*x**2 + k*x**4

2)对于固定的m和k,当你想最小化V关于x的时候,创建一个已经设置了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

但这基本上是对functools.部分只为V

您可以使用^{}

# 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对我来说也很好。你知道吗

相关问题 更多 >