2014-01-12 27 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只爲五