前提・実現したいこと
Pythonのメソッドの戻り値に自クラスを型注釈で指定したい.
該当のソースコード
メソッドの戻り値に自クラスを指定したいとき, 例として自身のコピー用メソッドを定義したいとき, 型注釈ありで自然に書くと以下のようになると思います.
python
1class User: 2 def __init__(self, name: str) -> None: 3 self.name = name 4 5 def __copy__(self) -> User: 6 return User(name=self.name) 7 8 def __repr__(self) -> str: 9 return "User(name: {})".format(self.name) 10 11 __str__ = __repr__
発生している問題・エラーメッセージ
shell
1Traceback (most recent call last): 2 File "user.py", line 1, in <module> 3 class User: 4 File "user.py", line 5, in User 5 def __copy__(self) -> User: 6NameError: name 'User' is not defined
どうやらUserの定義後でないとUserの名前を解決できないらしく, NameErrorを吐かれてしまいます.
試したこと
継承元を作り, そちらを型注釈に用いることで似たような意味合いの型注釈は実現できています.
python
1from abc import ABC 2 3 4class BaseUser(ABC): 5 pass 6 7 8class User(BaseUser): 9 def __init__(self, name: str) -> None: 10 self.name = name 11 12 def __copy__(self) -> BaseUser: 13 return User(name=self.name) 14 15 def __repr__(self) -> str: 16 return "User(name: {})".format(self.name) 17 18 __str__ = __repr__
ただ, 抽象クラスの必要性が低い場面でまでいちいち継承元を作るのもばからしいですし, 厳密な意味合いを考えれば継承元ではなく自身のクラスであるべきだと思います.
なにか適切なソリューションはありますか?
型注釈自体あまり使ったことがないので初歩的な質問かもしれません.
よろしくお願いします.
補足情報(FW/ツールのバージョンなど)
sh
1$ python -V 2Python 3.7.2
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/31 12:38