2016-09-29 4 views
1

FitFunctionというファクトリクラスを作成しました。これは、私が示したものを超えて、たくさんのものを追加しています。ラベルメソッドpretty_stringは、書かれた文字列を返します。このファイルを実行すると、reprと同じくらい有用な文字列が出力されます。誰かがこれを実装する方法を知っていますか?抽象メソッドを持つファクトリクラス

#!/usr/bin/env python 

from __future__ import print_function, absolute_import 

import abc 
import types 
import numpy as np 

class FitFunction(object): 

    def __init__(self, python_function): 

     assert isinstance(python_function, types.FunctionType) 
     self._py_function = python_function 

    @abc.abstractmethod 
    def pretty_string(): 
     r""" 
     Return some pretty string. 
     """ 


class Gaussian(FitFunction): 


    def __init__(self): 

     def gaussian(x, mu, sigma, A): 
      coeff = (_np.sqrt(2.0 * _np.pi) * sigma)**(-1.0) 
      arg = -.5 * (((x - mu)/sigma)**2.0) 
      return A * coeff * _np.exp(arg) 

     FitFunction.__init__(self, gaussian) 

     @staticmethod 
     def pretty_string(): 
      return "1D Gaussian" 


if __name__ == "__main__": 

    print("Gaussian.pretty_string: %s" % Gaussian().pretty_string()) 

私は出力を比較できるように、私は同じパラメータを使用して、多くの異なるデータセットにGaussianを適用するので、私はGaussianを作成するためにFitFunctionをサブクラス化。

me$ ./FitFunction_SO_test.py 
Gaussian.pretty_string: <bound method Gaussian.pretty_string of <__main__.Gaussian object at 0x1005e2f90>> 

私は次の結果を探しています:

は参考のために、これは私がファイルを実行するときに何が起こるかである

me$ ./FitFunction_SO_test.py 
Traceback (most recent call last): 
    File "./FitFunction_SO_test.py", line 43, in <module> 
    print("Gaussian.pretty_string: %s" % Gaussian().pretty_string()) 
TypeError: pretty_string() takes no arguments (1 given) 
+0

あなたのインデントは 'Gaussian'クラスでは正しくないので、' pretty_string'は '__init__'メソッドのローカル変数として定義されています。 '@ staticmethod'と' def'が内部関数の 'def'ではなく' __init__'の 'def'で整列されていることを確認してください。 – Blckknght

答えて

0

用途:

print("Gaussian.pretty_string: %s" % Gaussian.pretty_string()) 

かそれ以外の場合は、reprメソッドを印刷しています。探している文字列であるメソッドを呼び出した結果はではありません。

+0

ただNoneを返します。それは問題を解決しません。 – blalterman

+0

@blalterman Huh? 'None'を返すのは何ですか? 'None'と表示されますか?それは私のために働いています。 Python 2.7.12で 'Gaussian.pretty_string:1D Gaussian'を表示します。 –

0

現時点では自分で確認できないため、これが問題を解決するかどうかは不明ですが、おそらく@abc.abstractstaticmethodを使用して(そして明らかにself引数を取り除いて)ベースクラスのメソッドをデコレートする必要があります。それで解決できない場合は、後でこの回答を削除します。それを修正したら、これをより良い答えに編集します。

+0

はい、私は「自己」を取り除く必要がありました。しかし、それは問題の一部にすぎません。編集を参照してください。 – blalterman

+0

'@ abstractmethod'ではなく' @ abstractstaticmethod'を使う必要があることは間違いありません。あなたはそれを試しましたか? –

+0

私のバージョンの 'abc'に' abstractstaticmethod'がありません。私がPython 2.7を使っていることに気づく価値はあります。 – blalterman

関連する問題