2012-01-31 98 views
3

我想寫一個包含一些數學函數的小Python模塊。從變量x我應該使用班級嗎? (Python)

def quad(x, a, b, c): 
    return a*x**2 + b*x + c 

正如你可能會注意到它包含幾個參數開:例如,它可能包含如下功能(即a, b, c)。現在,如果我要將它放在一個文件中並簡單地導入它,最終用戶將不得不始終使用除變量之外的參數調用該函數。正因爲如此我想創建一個類像這樣的:

class quad:          
    def __init__(self, a, b, c):    
     self.a = a        
     self.b = b        
     self.c = c        

    def eq(x):        
     return self.a*x**2 + self.b*x + self.c 

從而使最終用戶能夠使用它作爲:

q = quad(p, q, r) 
eq = q.eq  

這是做事的正確方法嗎?我對這個問題的題目感到非常抱歉,因爲我想不出一個更好的問題!

回答

7

這似乎是一個完全合理的使用類。基本上你應該考慮在你的程序涉及可以被建模爲具有狀態的對象的東西時使用一個類。這裏,多項式的「狀態」只是係數a,bc

您也可以使用Python的__call__特殊的方法,讓你把這個類,就好像是一個函數本身:這樣做的

class quad: 
    def __init__(self, a, b, c): 
     self.a = a 
     self.b = b 
     self.c = c 

    def __call__(x): 
     return self.a * x**2 + self.b * x + self.c 

q = quad(p, q, r) 
q(x) 

的另一種方式,這可能是稍微乾淨,只是簡單地返回一個帶有這些係數的函數。這本質上是鑽營的例子,如Tichodrama提到:

def quad(a, b, c): 
    def __quad(x): 
     return a * x**2 + b * x + c 

    return __quad 

或者使用lambda語法:

def quad(a, b, c): 
    return lambda x: a * x**2 + b * x + c 

這些然後可以使用像這樣:

q = quad(p, q, r) 
q(x) 
+0

+1用於充實咖喱。 – 2012-01-31 08:32:15

+0

+1謝謝!我想我會使用函數返回的例子,因爲我的函數定義有點太複雜,無法用lambda語法處理。 – pewfly 2012-01-31 08:58:26