Python 3.5 以降、クラスを個別のファイルに分割するのは簡単です。
メソッドをクラスにインポートするために、ブロック内import
でステートメントを使用することは実際には可能です。例えば、class ClassName:
class_def.py
:
class C:
from _methods1 import a
from _methods2 import b
def x(self):
return self.a() + " " + self.b()
私の例では、
C.a()
文字列を返すメソッドになりますhello
C.b()
を返すメソッドになりますhello goodbye
C.x()
したがって返されhello hello goodbye
ます。
a
とを実装するb
には、次の手順を実行します。
_methods1.py
:
from __future__ import annotations
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from class_def import C
def a(self: C):
return "hello"
説明:型チェッカーがコードを読み取っているときですTYPE_CHECKING
。True
型チェッカーはコードを実行する必要がないため、if TYPE_CHECKING:
ブロック内で発生する循環インポートは問題ありません。__future__
インポートにより、延期された注釈が有効になります。これはオプションです。それがなければ、型注釈を引用符で囲む必要があります (つまりdef a(self: "C"):
)。
_methods2.py
同様に次のように定義します。
from __future__ import annotations
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from class_def import C
def b(self: C):
return self.a() + " goodbye"
VS Code では、self.a()
ホバリング時に
検出された型を確認できます。
そして、すべてが期待どおりに実行されます。
>>> from class_def import C
>>> c = C()
>>> c.x()
'hello hello goodbye'
古い Python バージョンに関する注意事項
Python バージョン ≤3.4 の場合、TYPE_CHECKING
は定義されていないため、このソリューションは機能しません。
Python バージョン ≤3.6 では、延期されたアノテーションは定義されていません。from __future__ import annotations
回避策として、上記の型宣言を省略して引用符で囲みます。