web-dev-qa-db-ja.com

同じファイルで複数のクラスを定義することはPythonicと見なされますか?

pythonを初めて使用する際に、同じファイルで複数のクラスを作成することになりました。これは、クラスごとに1つのファイルを使用するJavaなどの他の言語とは対照的です。

通常、これらのクラスは1つの抽象基本クラスで構成され、使用される具体的な実装は1〜2個程度異なります。以下にそのようなファイルを1つ投稿しました。

class Logger(object):

    def __init__(self, path, fileName):
        self.logFile = open(path + '/' + filename, 'w+')
        self.logFile.seek(0, 2)

    def log(self, stringtoLog):
        self.logFile.write(stringToLog)

    def __del__(self):
        self.logFile.close()

class TestLogger(Logger):   

    def __init__(self, serialNumber):
        Logger.__init__('/tests/ModuleName', serialNumber):

    def readStatusLine(self):
        self.logFile.seek(0,0)
        statusLine = self.logFile.readLine()
        self.logFile.seek(0,2)
        return StatusLine

    def modifyStatusLine(self, newStatusLine):
        self.logFile.seek(0,0)
        self.logFile.write(newStatusLine)
        self.logFile.seek(0,2)

class GenericLogger(Logger):

    def __init__(self, fileName):
        Logger.__init__('/tests/GPIO', fileName):

    def logGPIOError(self, errorCode):
        self.logFile.write(str(errorCode))

上記のように、私はロガー基本クラスを持っていますが、その下にいくつかの実装の違いがあります。

質問:これはPythonの標準ですか、それとも任意の言語ですか?この実装を使用すると、どのような問題が発生する可能性がありますか?

EDIT:このspecificファイルに関するガイダンスを実際に探しているわけではありませんが、より一般的な意味でです。クラスが3〜5のやや複雑なメソッドになった場合はどうなりますか?それらを分割することは理にかなっていますか?ファイルを分割する必要があると言うためのカットオフはどこにありますか?

32
Ampt

大丈夫だよ。参考までに、C++でも問題ありません。

密結合されたものを一緒に保つことは賢明な習慣です。不適切な結合を回避することも良い方法です。適切なバランスをとることは、厳密なルールの問題ではありませんが、さまざまな懸念の間でバランスをとることです。

経験則:

  1. サイズ

    過度に大きなファイルは醜い場合がありますが、ここではそうではありません。醜さはおそらくファイルを分割する十分な理由ですが、その美的感覚の開発は主に経験の問題であるため、何をすべきかを理解するのに役立ちませんアプリオリ

  2. 関心事の分離

    具体的な実装に非常に異なる内部の懸念がある場合、単一のファイルにそれらの懸念がすべて蓄積されます。たとえば、依存関係が重複しない実装では、単一のファイルがそれらすべての依存関係の結合に依存します。

    したがって、サブクラスの依存関係への結合がインターフェースへの結合よりも重要であると考えることが妥当な場合があります(または逆に、インターフェースの実装の懸念は、その実装の内部の懸念よりも弱いです) )。

    具体的な例として、一般的なデータベースインターフェイスを取り上げます。インメモリDB、SQL RDBMS、およびWebクエリをそれぞれ使用する具体的な実装には、インターフェース以外に共通点がない可能性があり、軽量のインメモリバージョンを必要とするすべての人にSQLライブラリもインポートするよう強制するのは厄介です。

  3. カプセル化

    canカプセル化されたクラスを同じモジュールに記述しますが、モジュールの外部にエクスポートされない実装の詳細にアクセスできるため、不必要な結合を促進しますcould

    これは私が思う悪いスタイルですが、本当に習慣を破ることができない場合は、モジュールを分割することでより良い規律を強制することができます。

27
Useless

Pythonicが何であるかを知るための私のいつもの参考資料。

シンプルは複雑よりも優れています。

ネストよりもフラットの方が適しています。

From The Zen Of Python から

ほとんど例外なく、クラス名はCapWords規則を使用します。

パッケージとモジュールの名前モジュールは、すべて小文字の短い名前にする必要があります。 [...]モジュール名はファイル名にマップされます

から PEP 8

私の解釈では、物事をシンプルかつフラットに保つことができるので、それで結構です。また、クラス名とファイル名は大文字と小文字が異なるため、いずれにしても同じであるとは想定されていないため、ファイルに複数の関連クラスをパックする際に問題は発生しません。

7
SylvainD

あなたが今持っているものは大丈夫です。標準ライブラリにアクセスして、1つのファイルに複数の関連クラスを持つモジュールがたくさんあります。ある時点で状況は大きくなり、最終的に複数のファイルを持つモジュールの使用を開始することになりますが、実際のルールはありません。 1つのファイルが「大きすぎる」と感じ始めると、物事は分割されます。

1

それは間違いなく大丈夫であり、実現されている限り、1つのファイルに複数のクラスを含めることをお勧めします。一般に、クラスは短く簡潔にする必要があり、巨大なモノリシッククラスを構築するよりも、2つ以上のクラスに動作を分割する必要があります。複数の小さなクラスを作成する場合、関連するクラスを同じファイルに保持することが本当に必要であり、役立ちます。

0
wirrbel