[解決済み] 引数の型に基づいて __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)
また、呼び出し元は同じ型を、あるときは単一の項目として、またあるときは一連の項目として、異なる目的で使用したいかもしれません。明示的であることは、すべての疑念を取り除き、より堅牢で明確なコードにつながる。
関連
-
Python 人工知能 人間学習 描画 機械学習モデル作成
-
Python カメの描画コマンドとその例
-
Python百行で韓服サークルの画像クロールを実現する
-
[解決済み】 AttributeError: モジュール 'matplotlib' には属性 'plot' がない。
-
[解決済み】Python: SyntaxError: キーワードは式になり得ない
-
[解決済み] __init__.py でも「非パッケージで相対的なインポートを試みた」を修正する方法
-
[解決済み] 列の値に基づいてDataFrameから行を選択するにはどうすればよいですか?
-
[解決済み] オブジェクトの属性に基づいてオブジェクトのリストを並べ替えるには?
-
[解決済み] オプションの引数を持つPython関数を作成するにはどうしたらいいですか?
-
[解決済み】メソッドの型ヒントは、どのようにエンクロージャクラスの型を使用するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python Decorator 練習問題
-
Pythonショートビデオクローラーチュートリアル
-
[解決済み】DataFrameのコンストラクタが正しく呼び出されない!エラー
-
[解決済み] _tkinter.TclError: 表示名がなく、$DISPLAY環境変数もない。
-
[解決済み】TypeError: 系列を <class 'float'> に変換することができません。
-
[解決済み】IndexError: invalid index to scalar variableを修正する方法
-
[解決済み】SyntaxError: デフォルト以外の引数がデフォルトの引数に続く
-
[解決済み】 'numpy.float64' オブジェクトは反復可能ではない
-
[解決済み】Pythonで複数のコンストラクタを持つためのクリーンでPythonicな方法は何ですか?
-
[解決済み】Pythonで複数のコンストラクタを定義することはできないのでしょうか?[重複しています]。