どのようにモジュールを複数のファイルに分割しますか?


問題
モジュールを複数のファイルに分割したいです。しかし、分離されたファイルを論理モジュールに統合する際に既存のコードを破壊したくないです。
ソリューション
プログラムモジュールは、パッケージになることによって複数の独立したファイルに分割することができます。以下の簡単なモジュールを考慮してください。

# mymodule.py
class A:
  def spam(self):
    print('A.spam')

class B(A):
  def bar(self):
    print('B.bar')
mymodule.pyを二つのファイルに分けたいと考えていますが、それぞれの定義の種類があります。このようにするには、まずmymoduleディレクトリでファイルmymodule.pyを入れ替えます。このディレクトリでは、以下のファイルを作成します。

mymodule/
  __init__.py
  a.py
  b.py
a.pyファイルに以下のコードを挿入します。

# a.py
class A:
  def spam(self):
    print('A.spam')
b.pyファイルに以下のコードを挿入します。

# b.py
from .a import A
class B(A):
  def bar(self):
    print('B.bar')
最後に、グウinit_.pyでは、2つのファイルを結合します。

# __init__.py
from .a import A
from .b import B
これらの手順に従うと、生成されたパケットMyModuleは単一の論理モジュールとして動作する。

>>> import mymodule
>>> a = mymodule.A()
>>> a.spam()
A.spam
>>> b = mymodule.B()
>>> b.bar()
B.bar
>>>
討論する
この章での主な問題は設計上の問題であり、ユーザーが多くの小さいモジュールを使ってほしいかどうかに関わらず、或いはただのモジュールを使ってもいいです。例えば、大きなコードライブラリでは、このすべてを独立したファイルに分割して、ユーザーに大量のimport文を使用させることができます。

from mymodule.a import A
from mymodule.b import B
...
このように仕事ができるが、これはユーザーにより多くの負担を与え、ユーザーは異なる部分がどこにあるかを知る必要がある。通常、これらを統一して、一つのimportを使うのはもっと簡単です。

from mymodule import A, B
後者にとって、mymoduleを大きなソースファイルにするのは最も一般的です。しかし、この章では、複数のファイルを統合して単一の論理名前空間にする方法を示しています。このようにするための鍵はパッケージを作成し、_u u u uを使用することです。init_.pyファイルは部分ごとに接着します。
モジュールが分割されるときは、相互参照のファイル名に特に注意が必要です。例を挙げると、この章ではBクラスはAクラスにアクセスする必要があります。パッケージの相対導入from.a import Aで取得します。
全体の章では、トップレベルのモジュール名をソースコードにハードエンコードしないようにパッケージの相対導入を使用します。モジュールの名前を変更したり、他の場所に移動しやすくします。
この章の延長として紹介します。図に示すように、__uinit_.pyファイルは必要なすべてのコンポーネントを一度に導入します。しかし、大きなモジュールについては、必要な時にのみモジュールをロードしたいと考えているかもしれません。この点をやり遂げるには,__u u u唵init_.pyには小さな変化があります。

# __init__.py
def A():
  from .a import A
  return A()

def B():
  from .b import B
  return B()
このバージョンでは、クラスAとクラスBは、最初のアクセス時に必要なクラスをロードする関数に置き換えられます。ユーザーにとって、これは大きな違いがないように見えます。たとえば:

>>> import mymodule
>>> a = mymodule.A()
>>> a.spam()
A.spam
>>>
遅延負荷の主な欠点は継承とタイプチェックが中断されることである。あなたはコードを少し変えるかもしれません。例えば:

if isinstance(x, mymodule.A): # Error
...

if isinstance(x, mymodule.a.A): # Ok
...
遅延負荷の実際例は、標準的なライブラリmultiprocessing/u u 0026 quot;を参照してください。init_.pyのソースコード
以上はPythonがモジュールを複数のファイルに分割する方法の詳細です。Pythonがモジュールを複数のファイルに分割した資料については、他の関連記事に注目してください。