GoのインターフェースはJavaのインターフェースと同じくメソッドの型だけを記述した型となります。 インターフェイスはメソッドのまとまりなので、インターフェイスを通してオブジェクトの振る舞いを定義することが可能です。 https://dev.classmethod.jp/articles/golang-6/
例えば、本番はクラウドストレージを使うが、ローカル開発環境では開発マシンのファイルを使いたいとき。
class CloudStorageFileReader:
"""本番用に Cloud Storage のファイルを読む。"""
def read_file(self) -> str:
"""決まったパスのテキストファイルの中身を返す。"""
return "I'm in Cloud Storage."
class LocalFileReader:
"""開発用にローカルファイルを読む。"""
def read_file(self) -> str:
"""決まったパスのテキストファイルの中身を返す。"""
return "I'm in localhost."
def read_file() -> str:
"""ファイルを読んでテキストを返す。"""
if IS_LOCAL:
reader = LocalFileReader()
else:
reader = CloudStorageFileReader()
return reader.read_file()
IS_LOCAL = False
text = read_file()
print(text)
I'm in Cloud Storage.
IS_LOCAL = True
text = read_file()
print(text)
I'm in localhost.
%reload_ext mypy_ipython
%mypy
note: In function "read_file": reader = CloudStorageFileReader() error: Incompatible types in assignment (expression has type "CloudStorageFileReader", variable has type "LocalFileReader") Found 1 error in 1 file (checked 1 source file)
Type checking failed
import typing
def read_file() -> str:
"""ファイルを読んでテキストを返す。"""
reader: typing.Union[LocalFileReader, CloudStorageFileReader]
if IS_LOCAL:
reader = LocalFileReader()
else:
reader = CloudStorageFileReader()
return reader.read_file()
%reload_ext mypy_ipython
%mypy
Success: no issues found in 1 source file Type checking successful
Python 3.8 から。
import typing
@typing.runtime_checkable # isinstance を使う場合は要る。
class FileReader(typing.Protocol):
def read_file(self) -> str:
pass
def read_file() -> str:
"""ファイルを読んでテキストを返す。"""
reader: FileReader
if IS_LOCAL:
reader = LocalFileReader()
else:
reader = CloudStorageFileReader()
return reader.read_file()
%reload_ext mypy_ipython
%mypy
Success: no issues found in 1 source file Type checking successful