Pythonクラスのメソッドを並べ替えたいのですが、正しい順序がわかりません。
PyDevを使用してEclipseでメソッドを抽出すると、Eclipseは抽出されたメソッドを変更されたメソッドの上に配置します。ただし、これにより、下位レベルの詳細が上位レベルの詳細よりも優先されます。ボブおじさんによると、私のコードが新聞の見出しのように読めるように、反対のことをする必要があります。私がJavaをプログラムするとき、私は彼のアドバイスに従うだけです。
Pythonのベストプラクティスは何ですか?
Pythonクラスのメソッドを並べ替えたいのですが、正しい順序がわかりません。
PyDevを使用してEclipseでメソッドを抽出すると、Eclipseは抽出されたメソッドを変更されたメソッドの上に配置します。ただし、これにより、下位レベルの詳細が上位レベルの詳細よりも優先されます。ボブおじさんによると、私のコードが新聞の見出しのように読めるように、反対のことをする必要があります。私がJavaをプログラムするとき、私は彼のアドバイスに従うだけです。
Pythonのベストプラクティスは何ですか?
回答:
他の人が指摘しているように、メソッドを注文する正しい方法はありません。たぶんPEPの提案が役立つでしょうが、とにかく。できるだけ客観的にあなたの質問にアプローチしようと思います。
最初のインターフェース:パブリックメソッドとPythonマジック関数は、クラスのインターフェースを定義します。ほとんどの場合、あなたや他の開発者は、クラスを変更するのではなく、使用したいと考えています。したがって、彼らはそのクラスのインターフェースに興味を持つでしょう。ソースコードの最初に配置すると、気にしない実装の詳細をスクロールする必要がなくなります。
プロパティ、マジックメソッド、パブリックメソッド:これら3つの間で最適な順序を定義するのは困難です。これらはすべて、クラスのインターフェイスの一部です。@EthanFurmanが言うように、プロジェクト全体で1つのシステムに固執することが最も重要です。一般的に、人々__init__()はクラスで最高の最初の関数を期待しているので、私はすぐ下の他の魔法の方法をフォローアップします。
読み方:基本的に、ストーリーを伝えるには、ボトムアップまたはトップダウンの2つの方法があります。高レベルの関数を最初に置くことにより、開発者は最初の数行を読むことでクラスの大まかな理解を得ることができます。そうしないと、クラスを理解するためにクラス全体を読む必要があり、ほとんどの開発者にはそのための時間がありません。経験則として、メソッドは、本体から呼び出されるすべてのメソッドよりも優先されます。
クラスメソッドと静的メソッド:通常、これは上記で説明した読み取り順序によって示されます。通常のメソッドはすべてのメソッドを何度も呼び出すことができるため、最初になります。クラスメソッドは、クラスメソッドと静的メソッドのみを呼び出すことができ、次に来ることができます。静的メソッドは、クラスの他のメソッドを呼び出して最後に来ることはできません。
お役に立てれば。ちなみに、これらのルールのほとんどはPython固有のものではありません。メソッドの順序を強制する言語を私は知りませんが、もしそうなら、それは非常に興味深いでしょう、そしてコメントしてください。
__init__明示的に(と組み合わせて__new__)または暗黙的に(デフォルトのコンストラクターを介して)呼び出すため、__init__。と一緒に配置する理由になります。(私はそれらが以前に 配置されたのを見たことがありませんが__init__。)
正しい順序はありません。システムを選び、それを使い続けます。私が使用するものは次のとおりです。
class SomeClass(object):
def __magic_methods__(self):
"magic methods first, usually in alphabetical order"
def _private_method(self):
"worker methods next, also in alpha order"
def a_method(self):
"then normal methods, also in alpha order"
@staticmethod、@classmethod、@property、およびその他の@decorator私は、それは(プロパティの間に行く傾向にあることを除いて、どこに行くかを決定するための方法の種類を使用して行を_private_methodsしてnormal_methods)。
@classmethodsが次に来る(@classmethod def a_class_method(cls))、次に@staticmethods(@staticmethod def a_static_method())を意味するのでしょうか。少なくともそれは私が理解しているポリシーです... (私はそれが好きではないのでIDEが何も折りたたむことなく)
私は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"
明らかに、これは小さなクラスにはあまり役に立ちません。
####ブロックを意図的に配置することに気付いたとき、編集の途中で醜いブロックを削除していました。しかし、私はこの質問の内容である順序に同意します。####質問の範囲に関係がなく、例は小さなクラスであり、####とにかく使用しないため、この例からを削除することをお勧めします。:-)