class BaseAsset:
def __init__(self,type_name,total_price,amount,**kwargs):
if type_name not in self.allowed_types:
raise ValueError(f'許可されてない商品{type_name}')
self.type_name = type_name
self.total_price = total_price
self.amount = amount
class Stock(BaseAsset):
def __init__(self,type_name,total_price,amount,date='',trader=''):
super().__init__(type_name,total_price,amount,)
self.date = date
self.trader = trader
2022/11/25 19:29
小川 慶一さんのコメント
(コメントID: 7974)
> 藤本さん、
こんばんは。
すいません...。これは、動画での説明が間違っています。
class BaseAsset では、この例では、 **kwargs は不要です。
いただいたコードを元にして書くと、以下のとおりで十分です。
class BaseAsset:
allowed_types = ['gold', 'silver', 'platinum']
def __init__(self, type_name, total_price, amount): # , **kwargs):
if type_name not in self.allowed_types:
raise ValueError(f'許可されてない商品{type_name}')
self.type_name = type_name
self.total_price = total_price
self.amount = amount
あるメソッドが(特に、 __init__ メソッドが) super クラスを呼び出さないときのパターンして、以下のようなやり方がよくあります。 **kwargs の key をインスタンス変数名、 value を値として、インスタンス変数を次々に追加していく方法です。
class BaseAsset:
allowed_types = ['gold', 'silver', 'platinum']
def __init__(self, type_name, total_price, amount, **kwargs):
if type_name not in self.allowed_types:
raise ValueError(f'許可されてない商品{type_name}')
self.type_name = type_name
self.total_price = total_price
self.amount = amount
for k, v in kwargs.items():
setattr(self, k, v)
藤本 博子さんの投稿
(投稿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の復習になりました。
ありがとうございます。