2017-03-23 10 views
1

次の例では、将来のシチュータのコンテキストに依存する定数を選択できます。このクラスの使用例を正しく実装するにはどうすればよいですか?

class Constants: 
    SPEEDLIGHT = 3 * 10**8 
    GRAVITY = 9.81 

C = Constants() 
print(C.GRAVITY) 
>> 9.81 

各量は固定定数であるため、それほど難しくありませんでした。しかし、私が機能のために同様のことをしたいとします。以下のコードの最初のブロックでは、変数変数xと固定パラメータabの2つの分布を指定します。

class IntegrableDistribution: 
    def Gaussian(x,a,b): 
     cnorm = 1/(b * (2 * pi)**(1/2)) 
     return cnorm * np.exp((-1) * (x-a)**2/(2 * b**2)) 
    # Gaussian = Gaussian(x,a,b) 

    def Lognormal(x,a,b): 
     cnorm = 1/(b * (2 * pi)**(1/2)) 
     return cnorm * exp((-1) * (np.log(x)-a)**2/(2 * b**2))/x 
    # Lognormal = Lognormal(x,a,b) 

私はディストリビューションを呼び出し可能にするために名前を付けようとしていました。その結果、エラーメッセージが表示されたため、上記のコードをコメントアウトしました。次のコードブロックでは、入力を使用して統合用のディストリビューションを選択しようとしています(ただし、非常に非効率です)。

Integrable = IntegrableDistribution() 

class CallIntegrableDistribution: 

    def Model(): 

     def Pick(): 
      """ 
      1 : Gaussian Distribution 
      2 : Lognormal Distribution 
      """ 
      self.cmnd = cmnd 
      cmnd = int(input("Pick a Distribution Model: ")) 
      return cmnd 

     self.cmnd = cmnd 

     if cmnd == 1: 
      Distribution = Integrable.Gaussian 
     if cmnd == 2: 
      Distribution = Integrable.Lognormal 

     return Distribution 

OR ALTERNATIVELY 

    cmnd = { 
     1: Gaussian, 
     2: Lognormal, 
    } 

私はディストリビューションの問題に本当に関わっていません。私はそれを私の知られているものと未知のものを紹介するためにのみ適用しています。これを適切に行うためのいくつかの方法は、クラスや辞書を使って同様の/簡単な方法はありますか?

+1

1.エラーは何でしたか? 2.関数に大文字の名前を付けないでください。それはクラスのために予約されています。 – Carcigenicate

+0

'TypeError:*: 'property'と 'float'のためのサポートされていないオペランドタイプ – mikey

答えて

2

使用static methods

class IntegrableDistribution: 
    @staticmethod 
    def Gaussian(x,a,b): 
     cnorm = 1/(b * (2 * pi)**(1/2)) 
     return cnorm * np.exp((-1) * (x-a)**2/(2 * b**2)) 

    @staticmethod 
    def Lognormal(x,a,b): 
     cnorm = 1/(b * (2 * pi)**(1/2)) 
     return cnorm * exp((-1) * (np.log(x)-a)**2/(2 * b**2))/x 

と使用方法:

some_result = IntegrableDistribution.Gaussian(1, 2, 3) 
another_result = IntegrableDistribution.Lognormal(1, 2, 3) 
+0

これは意味があり、周りの遊びに何かを与えます。リンクされたドキュメントでは、 "静的メソッドは暗黙の最初の引数を受け取りません。これは固定パラメータではなく関数変数としてxを渡すことができないということですか? – mikey

+1

@mikey。いいえ。つまり、インスタンスメソッドとは異なり、静的メソッドを呼び出す場合、最初の引数はメソッドが呼び出されたインスタンスではありません(*インスタンスがないため意味があります)。この回答を見る:http://stackoverflow.com/a/1669524/1453822 – DeepSpace

関連する問題