2014-01-12 28 views
1

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

当然,这是行不通的,因为my_model.V不知道m和k是什么。正如我所说的,我想过在my_model文件中创建一个类,在该类中定义函数V(和其他!),并在scan.py中实例化传递参数“m”,“k”作为参数的类。但是,正如我所说,这听起来像是过度使用班级功能。例如,显然上面的函数V是静态的,所以在这个类中所有其他的定义都会发生。那么有没有其他更正确的方法来实现我想要的,还是我只是“过度反应”和/或完全误解了Python中类的使用?

+1

重新实现为什么'V'是静态的,如果它使用'm'和'k'成员? –

+0

@VaughnCato因为我不需要也不想将'self'传递给它。然后,我可以创建一个'class Model',将'm'和'k'定义为类(不是实例)变量。这对我来说似乎有点奇怪,这就是为什么我不愿意来这里,并问这是否是正确的方式来做到这一点......但它的工作原理。 – tchuncly

回答

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

+0

谢谢,这确实是解决这个问题的方法之一,它也将在我的项目的其他地方有用!我必须承认,我仍然不喜欢它的美学(不得不将参数传递给my_model.py中的每个函数),这就是为什么我要专注于找到一种方法来传递它们(作为类的参数),但我可以和它一起生活。 – tchuncly

2

我不知道我在正确理解你的问题,但我认为什么,我会做的是:

1)使V m和k的参数

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

2)要最大限度地减少V作为X,对于固定的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) 

吴国良伊利,使返回一个版本V的使用权m和k的函数:

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

但是这基本上functools.partial只为五