Select Language

AI Technology Community

7.5、Python getattr()、setattr()、hasattr()、delattr()の使用方法

先に紹介した方法で属性を操作する他に、属性を操作するための汎用的な方法があります。この方法は静的なリフレクションメカニズムに似ており、つまりオブジェクトの具体的な定義がわからない場合でも、クエリなどの方法でそのオブジェクトのいくつかの情報を取得することができます。

例えばオブジェクト a を取得しましたが、オブジェクト a がどのような型で、どのような属性を持っているかがわからない場合、dir() を使ってそのオブジェクトが持つ属性を確認することができます。この dir() で使用されるのが、この節で紹介する汎用属性インターフェース関数です。

1、getattr(オブジェクト, 属性名):属性を読み取る

これは「オブジェクト.属性」と同等です。

>>> class Student:                   # クラスStudentを定義
...     version = "1.0"              # クラス属性version
...     author = "python.cn"         # クラス属性author
...     def __init__(self):
...         self.score = 0
...                                                                             # クラス定義終了
>>> getattr(Student, 'version')       # Studentクラスの属性versionを取得
'1.0'
>>> student_a = Student()             # オブジェクトを定義
>>> getattr(student_a, 'version')     # このオブジェクトのversion属性を取得
'1.0'
>>> getattr(student_a, 'score')       # このオブジェクトのscore属性を取得
0

2、setattr(オブジェクト, 属性名, 属性値):属性を変更する

これは「オブジェクト。属性=属性値」と同等です。以下の例では属性を変更する方法を示しています。

>>> class Student:                                             # クラスStudentを定義
...     version = "1.0"                                 # クラス属性version
...     author = "python.cn"                    # クラス属性author
...     def __init__(self):
...         self.score = 0
...                                                                             # クラス定義終了
>>> setattr(student_a, 'score', 99)    # 属性scoreの値を変更
>>> getattr(student_a, 'score')                # 変更後の値を確認
99
>>> setattr(student_a, 'new_attr', 'new_attr_val')             # 属性を追加
>>> getattr(student_a, 'new_attr')             # 新しく追加した属性値を確認
'new_attr_val

3、hasattr(オブジェクト, 属性名):特定の属性を持っているかどうか

特定のオブジェクトが特定の属性を持っているかどうかを判断します。Python は動的な言語なので、オブジェクトが持つ属性も時間とともに変化します。このような場合、この関数を使って特定のオブジェクトが特定の属性を持っているかどうかを判断することができます。

>>> class Student:                     # クラスStudentを定義
...   version = "1.0"
...                                                                            # クラス定義終了
>>> hasattr(Student, 'version')        # クラスが属性versionを持っているかどうか
True
>>> student_obj1 = Student()           # クラスのインスタンスオブジェクトを作成
>>> hasattr(student_obj1, 'version')   # クラスのインスタンスオブジェクトがversion属性を持っているかどうか
True

4、delattr(オブジェクト, 属性名):特定の属性を削除する

その作用は del(オブジェクト.属性) と同じです。

>>> class Student:                    # クラスを定義
...   version = "1.0"
...                                                                             # クラス定義終了
>>> hasattr(Student, 'version')        # 属性versionを持っているかどうか
True
>>> student_obj1 = Student()           # クラスのインスタンスオブジェクトを作成
>>> hasattr(student_obj1, 'version')   # インスタンスオブジェクトが属性versionを持っているかどうか
True
>>> hasattr(student_obj1, 'new_attr')  # インスタンスオブジェクトが属性new_attrを持っているかどうか
False
>>> setattr(student_obj1, 'new_attr', 88)      # 属性new_attrを追加
>>> hasattr(student_obj1, 'new_attr')  # インスタンスオブジェクトが属性new_attrを持っているかどうか
True                                   # この属性を持っている
>>> delattr(student_obj1, 'new_attr')  # 属性new_attrを削除
>>> hasattr(student_obj1, 'new_attr')  # インスタンスオブジェクトが属性new_attrを持っているかどうか
False                                  # この属性を持っていない


post
  • 10

    item of content
前の章では、リストや辞書などのPythonの予め定義されたデータ型について説明しました。しかし、自分で新しいタイプを定義したい場合、クラスを使用する必要があります。つまり、クラスを使用することで自分だけのデータ型を定義でき、システムで定義された型だけを使う以上のことができます。
クラスはオブジェクト指向プログラミングにおいて非常に基本的な概念であり、最も基本的な機能は新しいデータ型を作成することです。さらに、クラスAから新しいクラスBを派生させることができ、その際クラスBはクラスAのすべての属性を継承します(これを継承機能と呼びます)。
この章では、クラスの定義と使用方法について説明します。具体的には、クラスのプロパティとメソッド、クラスの派生方法、多重継承の使用方法などを解説します。