Classの問題
問題文のプログラムを実行した場合の、出力結果を求めよ。
class Sample: # Sampleというclassを定義
c_list = [] # c_listという空のリストを定義
def add_c_list(self,data): # 1. で解説を記載。
self.c_list.append(data)
print("出力結果:", end=" ") # 2. で解説を記載。
sample1 = Sample() # Sampleクラスのインスタンスを作成
sample1.add_c_list("データ1") # 3. で解説を記載。
sample2 = Sample() # Sampleクラスのインスタンスを作成
sample2.add_c_list("データ2") # 3. で解説を記載。
for item_data in sample1.c_list: # 4. で解説を記載。 sample2.c_listとしても結果は同じ。
print(item_data, end=" ")
# 出力結果: データ1 データ2
- 解説
-
def add_c_list(self, data):
という行では、add_c_list
というメソッドが定義されています。
メソッドの引数としてself
とdata
が指定されています。
self
は、メソッドが属しているクラスのインスタンス自体を指します。
これにより、メソッド内からそのインスタンスの属性や他のメソッドにアクセスすることができます。data
は、メソッドに渡されるデータを表す引数です。
self.c_list.append(data)
は、self.c_list
というリスト(c_list
はクラスの属性)に、引数で与えられたdata
を追加する処理です。
append
メソッドは、リストの末尾に新しい要素を追加するためのメソッドです。
つまり、このメソッドは、クラスのインスタンスに対してadd_c_list
メソッドを呼び出すことで、引数として渡されたデータをc_list
リストに追加する役割を持っています。 -
"出力結果:"という文字列を表示します。
print
関数のend=" "
は、出力の最後にスペースを追加することを意味します。 -
sample1
のadd_c_list
メソッドに引数"データ1"を渡すことで、"データ1"がsample1.c_list
に追加されます。同様に、sample2
のadd_c_list
メソッドに引数"データ2"を渡すことで、"データ2"がsample2.c_list
に追加されます。 -
for
ループを使用して、sample1.c_list
内の要素を順番に取り出し、それぞれを表示します。ループ内では、item_data
という変数にリスト内の要素が順番に代入され、print
関数で表示されます。end=" "
により、各要素の後にスペースが追加されます。
Classの問題
下記のプログラムの行末のコード「print(x.f(300))」を別のコードに書き換えたい。
同じ出力結果が得られるように書き換えよ。
class MyClass:
"""A simple example class"""
i = 100
def f(self, i):
data = 20
return data * i
x = MyClass()
print(x.f(300))
# print(MyClass.f(x, 300))に書き換える
# 6000
- 解説
インスタンスオブジェクトとクラスオブジェクトのそれぞれで関数を呼び出す時のルールが異なることが問題です。
例えば下記のようなことを理解しておく必要があります。
h1 = OrderSheet()
インスタンスオブジェクト.メソッド名(関数の引数)
・h1.checking(x1)
クラスオブジェクト.関数名(インスタンスオブジェクト, 関数の引数)
・OrderSheet.checking(h1, x1)
Classの問題
出力結果を求めよ。
class Dog:
name = 'Fido'
def __init__(self, name):
self.name = name
d = Dog('Buddy')
print(Dog.name)
# Fido
- 解説
Dog.name
とすることでDog
のclass
にあるname
という変数を呼び出すことができます。また、name
にはFido
が格納されていますので、Fido
を出力できます。
Classの問題
出力結果を求めよ。
class DiveIntoCode:
def __init__(self, teacher, mentor):
self.teacher = teacher
self.mentor = mentor
dic = DiveIntoCode('Noro', 'Miyaoka')
print(dic.teacher)
print(dic.mentor)
# Noro
# Miyaoka
- 解説
class をインスタンス変数にする時の問題です。引数は通常、仮引数の部分の前から順番に格納されますが、self は class 自身が格納されているもののため、teacher から格納されます。
Classの問題
出力結果を求めよ。
def scope_test():
def do_local():
spam = "local spam"
def do_global():
global spam # spam変数がグローバルスコープに存在することを宣言する。
spam = "global spam"
spam = "nonlocal spam"
do_global() # do_global関数が呼び出されている。globalキーワードを使ってspamをグローバル変数として参照している。
scope_test()
print(spam)
# global spam
- 解説
スコープの問題です。6 行目の global 文で定義した変数は do_global() の外側で定義していることと同義になります。次に 7 行目で spam が更新され、13 行目で spam を出力すると、 7 行目で更新された内容が出力されます。
※ 各問題について、解説文を追記予定。