1. ホーム
  2. python

[解決済み] 引数の型に基づいて __init__ メソッドをオーバーロードするには?

2022-03-25 22:23:33

質問

例えば、リストであるdataというメンバーを持っているクラスがあるとします。

例えば、ファイル名(リストを初期化するためのデータを含む)または実際のリストでクラスを初期化できるようにしたいのです。

これを実現するためのテクニックを教えてください。

を見て型を確認するだけですか? __class__ ?

何か見逃しそうなトリックがあるのでしょうか?

引数の型によるオーバーロードが簡単なC++に慣れているのですが。

どのように解決するのですか?

代替コンストラクタ」を取得するためのより良い方法は、クラスメソッドを使用することです。例えば

>>> class MyData:
...     def __init__(self, data):
...         "Initialize MyData from a sequence"
...         self.data = data
...     
...     @classmethod
...     def fromfilename(cls, filename):
...         "Initialize MyData from a file"
...         data = open(filename).readlines()
...         return cls(data)
...     
...     @classmethod
...     def fromdict(cls, datadict):
...         "Initialize MyData from a dict's items"
...         return cls(datadict.items())
... 
>>> MyData([1, 2, 3]).data
[1, 2, 3]
>>> MyData.fromfilename("/tmp/foobar").data
['foo\n', 'bar\n', 'baz\n']
>>> MyData.fromdict({"spam": "ham"}).data
[('spam', 'ham')]

この方法がすっきりしている理由は、どのような型が期待されているのかについて疑う余地がなく、呼び出し側が与えたデータ型を使って何をするつもりだったのかを推測することを強いられないからです。の問題点は isinstance(x, basestring) また、呼び出し元は同じ型を、あるときは単一の項目として、またあるときは一連の項目として、異なる目的で使用したいかもしれません。明示的であることは、すべての疑念を取り除き、より堅牢で明確なコードにつながる。