第10章_クラスとオブジェクトの操作
今回の項目では、クラスとオブジェクトの操作について出題されます。
本試験の主教材である「Python3エンジニア認定基礎試験問題集」では第10章(P128~P129)の3問の内容です。
練習問題 1
次のクラスの定義として適切でない部分を指摘してください。
# クラスの定義
class Person:
def __init__(self, name):
name = name
答えはコチラをクリック!
答え:name = name → self.name = name
ポイント
インスタンス変数として保存するためには、〇〇をつける必要があります。
インスタンス変数として保存するためには、self.をつける必要があります。
現在のコードでは、name = nameは単に引数nameをローカル変数nameに代入しているだけで、そのローカル変数は__init__メソッドの実行が終わると消滅します。インスタンス変数として保存するためには、self.name = nameのようにself.をつける必要があります。
selfは現在のインスタンスを指し、self.nameとすることでそのインスタンスの属性としてnameが保存され、メソッドの外からもアクセスできるようになります。
練習問題 2
練習問題1のPersonクラスをインスタンス化するコードの誤りを指摘してください。
person = Person()
答えはコチラをクリック!
答え:person = Person() → person = Person(name)
ポイント
インスタンス化時には〇〇を渡す必要がある。
インスタンス化時には引数を渡す必要がある。
インスタンス化時に必要な引数を渡していない
person = Person() の部分が誤りです。
Personクラスの__init__メソッドはnameパラメータを必要としますが、コメントとは異なり、実際にはインスタンス化時に引数を渡していません。
このコードを実行すると、次のようなエラーが発生します:
TypeError: __init__() missing 1 required positional argument: ‘name’
正しい書き方:
person = Person(“John”) # nameパラメータに値を渡す
クラスをインスタンス化する際に必要な引数が欠けているため、エラーになります。
練習問題 3
以下のコードを実行した結果として正しいものを選択してください。
class Dog:
def __init__(self):
self.bark = "woof"
def speak(self):
bark = "bow-wow-"
print(bark)
print(self.bark)
dog = Dog()
dog.speak()
- bow-wow-
woof - bow-wow-
bow-wow- - woof
woof - woof
bow-wow-
答えはコチラをクリック!
答え:2
ポイント
Python で例外を発生させるには raise を使用します。
他の選択肢について:
1. trigger → 不正解。Python には trigger というキーワードは存在しません。
3. throw_error →不正解。throw は JavaScript などの言語で使われる例外発生のキーワードですが、Python では無効です。
4. exception→ 不正解。exceptionは「例外」を意味する単語ですが、Python では例外を発生させるキーワードではありません。Exception クラスは存在しますが、直接 exception と記述するとエラーになります。
確認問題 1
次のコードはDogクラスにクラス変数family、インスタンス変数bark、メソッドshow_familyを定義していますコードが正しく実行されるとき空欄➀~⑤に入る記述の組み合わせとして正しいものを選択してください。
class Dog:
#クラス変数familyを定義
➀ = "Canidae"
#特殊メソッド__init__の定義
def __init__ ➁:
# インスタンス変数barkの定義
➂ = "woof"
# show_familyメソッドの定義
def show_family④:
return f"DOGS belong to the family {⑤}."
1. ➀self.family ➁(self) ➂bark ④(self) ⑤family
2. ➀family ➁(self) ➂self.bark ④(self) ⑤self.family
3. ➀family ➁(self) ➂self.bark ④() ⑤family
4. ➀self.family ➁() ➂bark ④() ⑤self.family
答えはコチラをクリック!
答え:2
各空欄について説明します:
- ➀: クラス変数を定義する際は、直接familyと書きます。self.はインスタンス変数に使います。
- ➁: __init__メソッドは必ずselfパラメータを持ちます。これはインスタンス自身を参照するためです。
- ➂: インスタンス変数を定義するときはself.を付けてself.barkとします。これによりインスタンスに属性を追加できます。
- ④: 通常のインスタンスメソッドはselfパラメータを持ちます。これによりメソッド内でインスタンスの属性にアクセスできます。
- ⑤: show_familyメソッド内でクラス変数familyにアクセスするにはself.familyと書きます。
選択肢2の組み合わせが最も適切です。
確認問題 2
確認問題1のDogクラスをインスタンス化するための記述として正しいものを選択してください。
1. dog = Dog()
2. dog = new Dog()
3. dog = Dog(self)
4. dog = new Dog(self)
答えはコチラをクリック!
答え:1
Pythonでクラスをインスタンス化する際の正しい構文は、クラス名に括弧 () を付けて呼び出す形式です。
各選択肢の解説:
- dog = Dog() – 正解
- Pythonでクラスのインスタンスを作成する正しい構文です。
- クラス名の後に括弧を付けて呼び出します。
- dog = new Dog() – 不正解
- JavaやC#などの言語では new キーワードを使いますが、Pythonでは不要です。
- Pythonにはこの構文はありません。
- dog = Dog(self) – 不正解
- self はクラス内のメソッドでインスタンス自身を参照するためのパラメータです。
- インスタンス化の際にユーザーが self を渡す必要はありません。
- dog = new Dog(self) – 不正解
- new キーワードはPythonでは使用しません。
- また self を外部から渡すのも誤りです。
Pythonではインスタンス化は単純に クラス名() の形式で行います。必要に応じてコンストラクタにパラメータを渡すことができます。
確認問題 3
次のコードでを実行した結果として正しいものを選択してください。
class Dog:
def __init__(self):
self.bark = "woof"
def speak(self):
bark = "bow-wow-"
print(bark)
print(self.bark)
self.bark = "ruff"
print(self.bark)
print(bark)
dog = Dog()
dog.speak()
1. bow-wow-
woof
ruff
bow-wow-
2. woof
woof
ruff
ruff
3. bow-wow-
bow-wow-
ruff
ruff
4. bow-wow-
woof
ruff
ruff
答えはコチラをクリック!
答え:1
このコードは、Dogクラスを定義し、犬の鳴き声を出力するプログラムです。
主な構成要素
- Dogクラス:犬を表すクラス
- __init__メソッド:インスタンス作成時に実行され、インスタンス変数self.barkを”woof”に初期化
- speakメソッド:鳴き声を出力するメソッド
- 変数の種類
- self.bark:インスタンス変数(オブジェクトに紐づく)
- bark:speakメソッド内のローカル変数
実行の流れ
- dog = Dog()でDogのインスタンスを作成(self.barkは”woof”に設定される)
- dog.speak()でspeakメソッドを実行すると:
- ローカル変数barkに”bow-wow-“を代入
- “bow-wow-“を出力
- インスタンス変数self.barkの値”woof”を出力
- インスタンス変数self.barkを”ruff”に変更
- 変更後の”ruff”を出力
- ローカル変数bark(変更されていない”bow-wow-“)を出力
次回は…
次回は「020_Pythonエンジニア認定基礎試験10-4~6」です。
標準ライブラリについて学びましょう!
参考資料一覧:Python3エンジニア認定[基礎試験]問題集
https://www.pythonic-exam.com
https://data-engineer-japan.com
https://mynavi-agent.jp
https://python-basic.com
https://www.tokai-bs.co.jp
https://freelance.techcareer.jp/articles/wp/skills/python/detail/550/
https://pythonzen-pep8-exam.jp/