基礎・上級問題チェック

問題 33 /40

次のコードで「Python」と「1000」の結果を得たい場合、【1】【2】【3】に入れる組み合わせとして正しいものはどれか。

class Item:
    def __init__(self, name):
        self.name = name
    def func(self):
        print(【1】.name)

class Book(【2】):
    def __init__(self, name, price):
        【3】().__init__(name)
        self.price = price
    def func(self):
        【3】().func()
        print(【1】.price)

x = Book('Python', 1000)
x.func()

選択 1

【1】self
【2】Item
【3】Item

選択 2

【1】super
【2】Item
【3】self

選択 3

【1】self
【2】Item
【3】super

選択 4

【1】self
【2】何も記述しない
【3】super

解説

選択肢3が正解です。

クラスの継承に関する問題です。

ベースになるクラスを基底クラスと呼び、基底クラスから派生したクラスを派生クラスと呼びます。

問題文の場合は、Itemクラスが基底クラスで、Bookクラスが派生クラスです。

派生クラスは「class クラス名(基底クラス名):」と記述します。

基底クラスの変数やメソッドを派生クラスで利用する場合はsuper()関数を使います。

問題文の流れは、以下のイメージになります。

-------------------------------
class Item:
    def __init__(self, name):
        self.name = name
       【9】 変数「name」で引数「'Python'」を受け取る


    def func(self):
        print(self.name)
       【12】 print文で引数「'Python'」を出力


class Book(Item):
【1】 Itemクラスを継承した派生クラス「Book」を定義


    def __init__(self, name, price):
        super().__init__(name)
        【2】 基底クラスであるItemクラスの変数「name」を借用して初期化
        【8】 引数「'Python'」の処理をItemクラスに委譲


        self.price = price
        【3】 Bookクラス自身の変数「price」を初期化
        【10】 Bookクラス自身の変数「price」で引数「1000」を受け取る


    def func(self):
        super().func()
        【4】 基底クラスであるItemクラスのfunc()メソッドを借用して再定義
        【11】 Itemクラスに処理を委譲


        print(self.price)
        【5】 Bookクラス自身のfunc()メソッドを定義
        【13】 print文で引数「1000」を出力


x = Book('Python', 1000)
【6】 引数を指定してBookクラスをインスタンス化


x.func()
【7】 イスタンス化したBookクラスのfunc()メソッドを実行

-------------------------------

(公式書籍 p.109-111)