5倍速!メールマガジン
外部アカウントで登録
受講生の声
新着の講座投稿
新着の講座コメント
新着のノート投稿
投稿一覧へ新着のノートコメント
表示できる投稿はありません。
サイト運営者紹介
小川 慶一講師/教材/システム開発者紹介
この学習サイトの教材制作、サポート、システム開発をすべてやっています。
表示できる投稿はありません。
この学習サイトの教材制作、サポート、システム開発をすべてやっています。
藤本 博子さんの投稿
(投稿ID: 5421)
お手数をおかけしますが、どうぞよろしくお願いいたします。
クラスとインスタンスのread.md P7に「__init__等のオーバーライドされるメソッドの仮引数に、*args,**kwargs等を置いて、任意の引数を受け取れるようにするケースもまま見うけられる。」という説明がございます。
インスタンスを生成する時に、辞書型の引数を複数渡す必要がある時に便利だと思いました。
今回の講座で、親クラス BaseAssetの__init__メソッドに、仮引数 **kwargsを任意で受け取れるよう追加を行ってます。
仮引数**kwargsを追加すると、親クラスのコンストラクタが呼び出された際に、kwargs={}とkwargs={dict:0}という初期値ができます。
ただし、親クラス BaseAssetの__init__メソッドに、仮引数 **kwargsを追加しないでも、class Stockのコンストラクタでself.dateと、self.traderの属性を初期化することができました。
今回のように、子クラスから呼び出される親クラスの__init__メソッドについて、子クラスで追加の属性を初期化する可能性がある場合は、親クラスの__init__メソッドて仮引数を追加したほうがいいのでしょうか。
お手数をおかけしますが、ご教示いただけるとありがたいです。
どうぞよろしくお願いいたします。
小川 慶一さんのコメント
(コメントID: 7974)
こんばんは。
すいません...。これは、動画での説明が間違っています。
class BaseAsset では、この例では、 **kwargs は不要です。
いただいたコードを元にして書くと、以下のとおりで十分です。
あるメソッドが(特に、 __init__ メソッドが) super クラスを呼び出さないときのパターンして、以下のようなやり方がよくあります。
**kwargs の key をインスタンス変数名、 value を値として、インスタンス変数を次々に追加していく方法です。
使用例:
出力結果
上記のパターンとどこかで混同してしまっていて、「事前準備としてこういうことをしておかなくては」と思ってしまったものと思います。
BaseAsset を継承した Stock クラスはより多くの引数を受け取っていますが、そこから super() で呼び出される BaseAsset クラスの __init__ メソッドでは特に想定外の引数を受け取ったりはしていません。
なので、 BaseAsset クラスの __init__ メソッドで **kwargs を引数に持つ必要はありません。
お詫びして、訂正いたします。
動画も、今、修正しました。
引きつづき、どうぞよろしくお願いいたします。
藤本 博子さんのコメント
(コメントID: 7975)
ご回答くださいまして、ありがとうございます。
また動画のご対応もありがとうございます。
>BaseAsset を継承した Stock クラスはより多くの引数を受け取っていますが、そこから super() で呼び出される BaseAsset クラスの __init__ メソッドでは特に想定外の引数を受け取ったりはしていません。
なので、 BaseAsset クラスの __init__ メソッドで **kwargs を引数に持つ必要はありません。
承知いたしました。
ご回答くださいまして、ありがとうございます。
>あるメソッドが(特に、 __init__ メソッドが) super クラスを呼び出さないときのパターンして、以下のようなやり方がよくあります。
**kwargs の key をインスタンス変数名、 value を値として、インスタンス変数を次々に追加していく方法です。
事例をご提示くださいまして、ありがとうございます。
setatterの復習になりました。
ありがとうございます。