Python 3 エンジニア認定実践試験対策として、第4章「Pythonのクラス」についてChatGPTで生成した模擬問題です。
生成された問題の適切性と“正解”回答の正しさは一通り検証しておりますので、皆さんのご参考になれれば嬉しいです。
問題
問題は以下になります。問題の下に正解を隠してますので、クリックしたら確認できます。
あとは、検証した内容や補足を付け加えてますので参考にしてください。
-
Pythonでクラスを定義するために使用されるキーワードは何ですか?
- a) def
- b) class
- c) module
- d) object
クリックして正解と解説をチェック
正解: b) classPythonはモジュールでもmodule使わずに、直接
def func():
のようにメソッドを定義し、ファイル名がモジュール名になるみたいですね。
-
クラス内で定義される変数を何と呼びますか?
- a) 属性
- b) メソッド
- c) オブジェクト
- d) インスタンス
クリックして正解と解説をチェック
正解: a) 属性元のa)は「アトリビュート」でした。。これは、、あまり言わないかな〜
-
Pythonのdataclassデコレーターは、何を行うために使用されますか?
- a) クラスのデータ属性を非公開にする
- b) クラスのデータ属性を静的にする
- c) クラスのデータ属性を自動的に生成する
- d) クラスのデータ属性を削除する
クリックして正解と解説をチェック
正解: c) クラスのデータ属性を自動的に生成するテキストP98になります。dataclassを使わない場合、
__init__()
や__repre__()
を書かなければいけないですが、@dataclassを付けるだけでこういった特殊メソッドが自動的に生成されます。
-
クラス内の特殊メソッドで、オブジェクトが文字列として表現されるときの振る舞いを定義するのはどのメソッドですか?
- a) __init__
- b) __str__
- c) __repr__
- d) __del__
クリックして正解と解説をチェック
正解: b) __str__問題の表現は微妙ですが、テキストの表現(P91)では以下です。
- __repr__: 文字列表現
- __str__: 文字列型への変換
これも微妙に分からないですね。。
Differences between str and reprが参考になるかもしれません。
ただし、実際試験に出た問題として、__str__がなく、__repr__だけある場合はどうなるかという問題です。
どちらも定義した場合:class Person: def __init__(self, name, age): self.name = name self.age = age def __str__(self): return f"{self.name} is {self.age} years old." def __repr__(self): return f"Person('{self.name}', {self.age})" person = Person("Json", 25) print(person) print(repr(person))
実行結果は上記参考サイトの通り:
$ python person.py Json is 25 years old. Person('Json', 25)
__str__を定義しない場合:
class Person: def __init__(self, name, age): self.name = name self.age = age def __repr__(self): return f"Person('{self.name}', {self.age})" person = Person("Json", 25) print(person) print(repr(person))
実行したこうなります:
$ python person.py Person('Json', 25) Person('Json', 25)
少し意外ではありませんか?
__str__
がないとき、__repr__
が呼ばれます。
print()の結果聞かれた時に気をつけましょう!
-
クラス内で直接アクセスできない属性を示すために、通常、どの接頭辞を使用しますか?
- a) @property
- b) _
- c) public
- d) private
クリックして正解と解説をチェック
正解: b) _9.6. Private Variablesから引用です。
“Private” instance variables that cannot be accessed except from inside an object don’t exist in Python. However, there is a convention that is followed by most Python code: a name prefixed with an underscore (e.g. _spam) should be treated as a non-public part of the API (whether it is a function, a method or a data member). It should be considered an implementation detail and subject to change without notice.
簡単に言うと、Pythonには直接アクセスできない(つまりプライベート)変数は存在しないとのことです!
「_」を付けても、アクセスしようと思えばアクセスはできますので、問題には気をつけましょう!
-
クラスAがクラスBを継承しており、クラスAがクラスBのメソッドを変更することを何と呼びますか?
- a) メソッドオーバーライド
- b) メソッドオーバーロード
- c) メソッド拡張
- d) メソッド継承
クリックして正解と解説をチェック
正解: a) メソッドオーバーライドPythonの標準ライブラリにはJavaのような
@Override
がなく、オーバーライドされたものかどうか分かりにくいかもしれません。
サードパーティライブラリでは、overridesがあるようですね。
-
クラスの継承関係を調査するために使用される関数は何ですか?
- a) explore()
- b) superclass()
- c) issubclass()
- d) inheritance()
クリックして正解と解説をチェック
正解: c) issubclass()テキストP104にありますが、個人的には少し面白い例を次の挙げておきますが、boolはintのサブクラスなら、まあ、なんとなく分かりますが、intもobject扱いなんて、、思いませんでした。
>>> issubclass(bool, int) True >>> issubclass(int, object) True
-
クラス内の特殊メソッドで、オブジェクトがコピーされる際に呼び出されるものは何ですか?
- a) __init__
- b) __str__
- c) __copy__
- d) __repr__
クリックして正解と解説をチェック
正解: c) __copy__これはテキストには紹介されていなかった内容ですが、次のようになります。
import copy class Person: def __init__(self, name, age): self.name = name self.age = age def __repr__(self): return f"Person('{self.name}', {self.age})" def __copy__(self): print("copy Persion") return self person = Person("Json", 25) print(person) person2 = copy.copy(person) print(person2)
実行するとこうなります。
$ python person.py Person('Json', 25) copy Persion Person('Json', 25)
__copy__()
中でreturn self
で良いか分からないですが、copy Persion
が出力されたということは該当メソッドが呼ばれたことに間違いないでしょう。
コメントを残す