基礎・上級問題チェック
問題 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)