2012-01-31 6 views
3

私はいくつかの数学的関数を含む小さなPythonモジュールを書こうとしています。例えば、それはのような関数含まれている場合があります:(。すなわちa, b, c)あなたはそれがいくつかのパラメータが含まれて気づくことのよう私はクラスを使うべきですか? (Python)

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

を離れ変数xから。これをファイルに入れて単純にインポートすると、エンドユーザーは変数に加えてパラメータを持つ関数を常に呼び出す必要があります。私はこのようなクラスを作成することを考えた。このため、次

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,b、およびcの単なる係数です。

また、それが機能そのものであるかのようにクラスを扱うことができるように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をカレー化するための+1。 –

+0

+1ありがとう!関数の定義はλ構文で扱うにはあまりに複雑すぎるので、私は関数を返す例を取り上げるつもりだと思います。 – pewfly

5

それはあなたのように見えますcurryingのようなものを探しています。

おそらくthis questionがお手伝いします。

関連する問題