投稿/コメントを表示します。

多重継承について確認と気になる箇所がございました。
重ねての質問となり恐縮でございますが、どうぞよろしくお願いいたします。

■多重継承するクラス両方に、__init__メソッドがある場合

・動画sample44.py class Stock(CSVMixin, BaseAsset):の場合は、BaseAssetのみ、__init__メソッドがあります。super()でBaseAssetのコンストラクタを呼び出しました。

・part09_52_multiple_inheitance.pyのclass WrappedStock(CSVDealsMixin, Asset):の場合は、両方に__init__メソッドがあります。

super()でCSVDealsMixinのクラスを明示しなくても、CSVMixinの__init__メソッドでコンストラクタを呼び出されました。
多重継承のクラスで、super()を呼び出すときは、左側の継承先のクラスのインスタンスメソッドが呼び出されるという理解で問題ございませんでしょうか。
継承の順番を注意する必要があるのだと思いました。

■コードがエラーになる箇所
以下2点気になりました。

[1]part09_52_multiple_inheritance.py 10行目
クラスとインスタンス read.md P13にも同じサンプルコードがございます。

class WrappedStockで、super()で継承先のクラスのコンストラクタを呼び出すコードがございます。
引数(name, base_price * total_weight)を渡すコードのため、
TypeError: CSVDealsMixin.__init__() missing 1 required positional argument: 'amount'というエラーが表示されました。

super()でmixins.pyのclass CSVDealsMixin:のコンストラクタへ変数を渡しますが、
受取る引数は(self, name, base_price, amount)なので、以下のコードになるかと思いました。
super().__init__(name, base_price, total_weight)

元のコード
class WrappedStock(CSVDealsMixin, Asset):
    """ DealsMixin, Asset を継承した、貴金属クラス """
    name = 'metal'

    def __init__(self, name, base_price, total_weight):
        super().__init__(name, base_price * total_weight)
        self.total_weight = total_weight

エラーのメッセージ
super().__init__(name, base_price * total_weight)
TypeError: CSVDealsMixin.__init__() missing 1 required positional argument: 'amount'

以下の引数で渡すと実行できました。
super().__init__(name, base_price, total_weight)

[2]mixins.py 45行目 def sell(self, units):でget_current_price_per_unitというインスタンスメソッドを指定しますが、get_current_price_per_unit_from_csv()だと思いました。
self.total_price -= self.get_current_price_per_unit() * units

エラーのメッセージ
AttributeError: 'WrappedStock' object has no attribute 'get_current_price_per_unit'. Did you mean: 'get_current_price_per_unit_from_csv'?

以下のインスタンスメソッドを指定すると、part09_52_multiple_inheritance.py 26行目
print(orange.sell(3000))の戻り値が売値150*3000=450,000となります。
self.total_price -= self.get_current_price_per_unit() * units

■動画の講座でCSVファイルを解析するmixinクラスをDictreaderで読み込むと、
引数の内容が分かりやすくなっていいと思いました。
class CSVMixin:
    """CSVファイルを解析するmixinクラス"""

    def get_value_from_csv(self, response, field_no):
        """CSVファイルを取得してkeyに対応する値を返す"""
        text_lines = response.text.splitlines()
        reader = csv.DictReader(text_lines,)
        for k in reader:
            if k['company_name'] == self.type_name:
                return int(k['buy'])
        raise ValueError(f'{self.type_name}の情報はみつかりません')

2022/11/26 14:58