Python结构化-我真的需要一个类吗?

Python结构化-我真的需要一个类吗?,python,class,project-structuring,Python,Class,Project Structuring,我有一个问题,解决方案似乎是创建一个类。然而,这个类中的所有方法都是静态的,我只会实例化这个类一次,所以我想知道使用一个类是否是正确的方法 更具体地说,我希望有一个单独的模块来存储一些函数和一些变量,它们本质上是程序的框架。这些函数和变量依赖于定义我的模型的一些参数,我不想将这些参数作为参数传递,因为我可能会在以后指定(如果相关)的其他原因。例: # my_model.py def V(x): return -m*x**2 + k*x**4 在另一个模块上,我扫描了这些参数m和k的一些值

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

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

# 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_模型文件中创建一个类,定义函数V和其他!然后在scan.py中实例化该类,并将参数m、k作为参数传递。但是,正如我所说的,我觉得这是对类特性的过度使用。例如,显然上面的函数V是静态的,这个类中的所有其他定义也是静态的。那么,有没有其他更合适的方法来实现我想要的,或者我只是反应过度和/或完全误解了Python中类的使用?

您可以使用:

然后像这样使用它:

# 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)
这实际上只是作为一个类的替代。这里的口味不同,有些人建议你真的应该这样做。对我来说,使用一个类并为不同的模型函数使用@classmethods也很好。

您可以使用:

然后像这样使用它:

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

这实际上只是作为一个类的替代。这里的口味不同,有些人建议你真的应该这样做。使用一个类并为不同的模型函数使用@classmethods对我来说也很好。

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

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

但这基本上是functools.partial的重新实现,仅适用于V.

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

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

但这基本上是functools.partial的重新实现,仅适用于V.

如果V使用m和k成员,为什么V是静态的?@VaughnCato,因为我不需要也不想将self传递给它。然后,我可以创建一个类模型,其中我将m和k定义为类变量,而不是实例变量。这对我来说确实有点奇怪,这就是为什么我不愿意来这里问这是否是正确的方法…但它是有效的。如果它使用m和k成员,为什么V是静态的?@VaughnCato,因为我不需要也不想将自我传递给它。然后,我可以创建一个类模型,其中我将m和k定义为类变量,而不是实例变量。这对我来说确实有点奇怪,这就是为什么我不愿意来这里询问这是否是正确的方法…但它是有效的。谢谢,这确实是解决这个问题的一种方法,而且它在我的项目的其他地方也会很有用!我必须承认,我仍然不喜欢将参数传递给我的_model.py中的每个函数的美学,这就是为什么我一直专注于寻找一种方法将它们作为类参数传递一次,但我可以接受。谢谢,这确实是解决这个问题的一种方法,在我的项目的其他地方也会很有用!我必须承认,我仍然不喜欢将参数传递给我的_model.py中的每个函数的美感,这就是为什么我专注于寻找一种方法将它们作为类参数传递一次,但我可以接受它。