2016-09-15 14 views
0

著者が私がよく知らないコーディングスタイルを使用しているコードを読んでいます。彼らは絶対にすべての関数定義をクラスに入れました。たとえば、著者とコードベースを特定しないように削除された詳細:クラス内で単一の静的メソッドをラップするのはなぜですか?

class CSVChecker: 
    @staticmethod 
    def is_ok(file): 
     #some stuff that could return False 
     return True 

これはこのクラスの最後です。多くの類似。いいえ__init__またはselfです。使用法:if CSVChecker.is_ok(afile)

これは、他の言語からPythonに引き継がれた奇妙な文法的な奇妙なものですか?それとも、ファイルの最上位にあるdef csv_check_file_ok(file):ではなく、Pythonの理由がありますか?

+4

私はそれが、他の言語からPythonに持ち越された奇妙な文法的な変わったものだと思います。私は、Javaプログラマが書いた冗長なPythonコードを見てきました。 – khelwood

+1

このメソッドは決して*動的に使用されませんか?それはいくつかの状況で理にかなっているので... 'checkers = [CSVChecker()、...];すべて(チェッカーのcのためのc.is_ok(foo)) ' – deceze

+0

あなたは著者に質問してみませんか? – jonrsharpe

答えて

1

@decezeはおそらく彼のコメントに答えがあります。これらの関数オブジェクトのいくつかは実際にリストに格納されており、リストのいくつかの要素は「適切な」オブジェクトのインスタンスである場合があります。他の場所

class F1: 
    def __init__(self, a): 
    self.max=a 
    def ok(self, x): 
    return x < self.max 

class F2: 
    @staticmethod 
    def ok(x): 
    return x > 0 

個人的に

checkers = [] 
... 
checkers.append(F1(i+j)) 
checkers.append(F2 ) 
.... 
if (all(check.ok(x) for check in checkers) 

私は@staticmethodに煩わさだけダミーdef __init__(self): passで任意の初期化を必要とF2()をインスタンス化していないクラスが書かれていないと思います。絶対基本的にストリップダウンまた、おそらく、単一静的メソッド関数オブジェクトのすべてがこのように使用されるわけではないので、別の言語(Java?)からのスタイルのキャリーオーバーがあります。そこでは、著者が将来的にそのように使用されるかもしれないと思った場合、あるいはパラメータでインスタンス化する必要性を獲得する可能性がある場合は、理にかなっています。

とにかく、私は何かを学んだし、将来他の人がやることを願っています。

EDITは後で追加:この使用法は今最適な熟考functools.partial

def f1(x, max=None): 
    return x < max 
#elsewhere ... 
checkers.append(functools.partial(f1, max=i+j)) 

を使用して行われているかもしれないものと同じを達成します。また、このクラスの使用法は、オブジェクトの「継承、合成、集約」分類にどのように適合しますか。そして、それが例外であるかどうか

これを行うには、1つ、好ましくは唯一の方法が必要です。 あなたがオランダ人でない限り、その方法は最初は明白ではないかもしれませんが。

+1

'@ staticmethod'は、メソッドが' self'または 'cls'引数を受け取らないことを意味します(* bound *にはなりません)。それは '@ classmethod'を意味するものではありません!それでも 'F2'をインスタンス化して' ok'を呼び出すことができます。空の '__init__'は必要ありません。完全に省略するだけです。与えられた実装は、実際には、空の '' __init__'を持つインスタンス化可能なクラスを書くための最善の方法です。 – deceze

+0

@decezeもう一度感謝します。 – nigel222

関連する問題