114

Python クラスでメソッドを並べたいのですが、正しい順序がわかりません。

PyDevを使用してEclipseでメソッドを抽出すると、Eclipse は抽出されたメソッドを変更されたメソッドの上に置きます。ただし、これにより、下位レベルの詳細が上位レベルの詳細の前に置かれます。Uncle Bobによると、私のコードが新聞の見出しのように読めるようにするには、反対のことを行う必要があります。Javaでプログラミングするときは、彼のアドバイスに従うだけです。

Python のベスト プラクティスは何ですか?

4

4 に答える 4

100

他の人が指摘しているように、メソッドを順序付ける正しい方法はありません。PEP の提案が役立つかもしれませんが、とにかく。できるだけ客観的にあなたの質問にアプローチしてみましょう。

  • 最初にインターフェイス:パブリック メソッドと Python マジック関数は、クラスのインターフェイスを定義します。ほとんどの場合、あなたや他の開発者は、クラスを変更するのではなく、クラスを使用したいと考えています。したがって、彼らはそのクラスのインターフェースに興味を持つでしょう。ソースコードの最初に置くことで、気にしない実装の詳細をスクロールする必要がなくなります。

  • プロパティ、マジック メソッド、パブリック メソッド:クラスのインターフェイスの一部であるこれら 3 つの間の最適な順序を定義するのは困難です。Ethan Furman が言うように、プロジェクト全体で 1 つのシステムに固執することが最も重要です。一般に、人々はクラスで最高の最初の関数を期待__init__()するので、すぐ下にある他の魔法のメソッドをフォローアップします。

  • 読む順序:基本的に、ストーリーを伝えるには 2 つの方法があります。ボトムアップまたはトップダウンです。高レベルの関数を最初に置くことで、開発者は最初の数行を読むだけでクラスの大まかな理解を得ることができます。そうしないと、クラスを理解するためにクラス全体を読まなければならず、ほとんどの開発者にはその時間がありません。経験則として、本体から呼び出されるすべてのメソッドの上にメソッドを配置します。

  • クラス メソッドと静的メソッド:通常、これは上記で説明した読み取り順序によって暗示されます。通常のメソッドはすべてのメソッドを何度も呼び出すことができるため、最初に呼び出されます。クラス メソッドは、クラス メソッドと静的メソッドのみを呼び出して次に来ることができます。静的メソッドは、クラスの他のメソッドを呼び出すことができず、最後に来ます。

ちなみに、これらのルールのほとんどは Python 固有のものではありません。メソッドの順序を強制する言語を知りません。

于 2016-05-01T14:17:35.983 に答える
17

正しい順序はありません。システムを選択し、それに固執します。私が使用するものは次のとおりです。

class SomeClass(object):

    def __magic_methods__(self):
        "magic methods first, usually in alphabetical order"

    def _private_method(self):
        "worker methods next, also in alphabetical order"

    def a_method(self):
        "then normal methods, also in alphabetical order"
于 2012-04-23T23:22:16.730 に答える
3

Django のソースで見たEthanと似たようなことをしていますが、主な違いは "############" ブロック コメントで領域を区切っている点です。

例えば、

class SomeClass(object):

    #################
    # Magic Methods #
    #################
    def __magic_methods__(self):
        "magic methods first"

    ##################
    # Public Methods #
    ##################
    def a_method(self):
        "then normal methods, in order of importance"

    ###################
    # Private Methods #
    ###################
    def _private_method(self):
        "then worker methods, grouped by importance or related function"

明らかに、これは小さなクラスにはあまり役に立ちません。

于 2012-04-23T23:28:31.537 に答える