Python 3 エンジニア認定実践試験 問題集4. 「Pythonのクラス」

投稿日:

更新日:

カテゴリ:

Python 3 エンジニア認定実践試験対策として、第4章「Pythonのクラス」についてChatGPTで生成した模擬問題です。

生成された問題の適切性と“正解”回答の正しさは一通り検証しておりますので、皆さんのご参考になれれば嬉しいです。

問題

問題は以下になります。問題の下に正解を隠してますので、クリックしたら確認できます。
あとは、検証した内容や補足を付け加えてますので参考にしてください。

  1. Pythonでクラスを定義するために使用されるキーワードは何ですか?

    • a) def
    • b) class
    • c) module
    • d) object
    クリックして正解と解説をチェック
    正解: b) class

    Pythonはモジュールでもmodule使わずに、直接def func():のようにメソッドを定義し、ファイル名がモジュール名になるみたいですね。


  2. クラス内で定義される変数を何と呼びますか?

    • a) 属性
    • b) メソッド
    • c) オブジェクト
    • d) インスタンス
    クリックして正解と解説をチェック
    正解: a) 属性

    元のa)は「アトリビュート」でした。。これは、、あまり言わないかな〜


  3. Pythonのdataclassデコレーターは、何を行うために使用されますか?

    • a) クラスのデータ属性を非公開にする
    • b) クラスのデータ属性を静的にする
    • c) クラスのデータ属性を自動的に生成する
    • d) クラスのデータ属性を削除する
    クリックして正解と解説をチェック
    正解: c) クラスのデータ属性を自動的に生成する

    テキストP98になります。dataclassを使わない場合、__init__()__repre__()を書かなければいけないですが、@dataclassを付けるだけでこういった特殊メソッドが自動的に生成されます。


  4. クラス内の特殊メソッドで、オブジェクトが文字列として表現されるときの振る舞いを定義するのはどのメソッドですか?

    • 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()の結果聞かれた時に気をつけましょう!


  5. クラス内で直接アクセスできない属性を示すために、通常、どの接頭辞を使用しますか?

    • 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には直接アクセスできない(つまりプライベート)変数は存在しないとのことです!
    「_」を付けても、アクセスしようと思えばアクセスはできますので、問題には気をつけましょう!


  6. クラスAがクラスBを継承しており、クラスAがクラスBのメソッドを変更することを何と呼びますか?

    • a) メソッドオーバーライド
    • b) メソッドオーバーロード
    • c) メソッド拡張
    • d) メソッド継承
    クリックして正解と解説をチェック
    正解: a) メソッドオーバーライド

    Pythonの標準ライブラリにはJavaのような@Overrideがなく、オーバーライドされたものかどうか分かりにくいかもしれません。
    サードパーティライブラリでは、overridesがあるようですね。


  7. クラスの継承関係を調査するために使用される関数は何ですか?

    • a) explore()
    • b) superclass()
    • c) issubclass()
    • d) inheritance()
    クリックして正解と解説をチェック
    正解: c) issubclass()

    テキストP104にありますが、個人的には少し面白い例を次の挙げておきますが、boolはintのサブクラスなら、まあ、なんとなく分かりますが、intもobject扱いなんて、、思いませんでした。

    >>> issubclass(bool, int)
    True
    
    >>> issubclass(int, object)
    True


  8. クラス内の特殊メソッドで、オブジェクトがコピーされる際に呼び出されるものは何ですか?

    • 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が出力されたということは該当メソッドが呼ばれたことに間違いないでしょう。



投稿日

カテゴリー:

投稿者:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です