Pythonのdelattr()とdel()の違い|クラス属性の削除方法をわかりやすく解説
Pythonには、クラスやオブジェクトから属性(アトリビュート)を削除するための方法として、delattr()関数とdelステートメントの2つが用意されています。delattr()は属性名を文字列として指定できるため、動的に属性を削除したい場合に便利です。一方、delは構文がシンプルで明示的であり、より効率的に属性を削除できます。
delattr()の使い方
delattr()関数の基本構文は以下のとおりです。
構文: delattr(オブジェクト名, 属性名) オブジェクト名: クラスからインスタンス化されたオブジェクトの名前 属性名: 削除したい属性の名前(文字列で指定)
サンプルコード
以下の例では、custclassというクラスを定義し、顧客ID(custid1〜custid3)を属性として持たせています。クラスをインスタンス化してcustomerオブジェクトを作成し、各属性の値を出力してみましょう。
class custclass:
custid1 = 0
custid2 = 1
custid3 = 2
customer = custclass()
print(customer.custid1)
print(customer.custid2)
print(customer.custid3)
実行結果
上記のコードを実行すると、次のような出力が得られます。
0 1 2
delattr()で属性を削除した場合
次に、delattr()関数を使ってcustid3属性を削除してからプログラムを実行してみます。属性がすでにクラスから削除されているため、custid3を出力しようとした時点でエラーが発生します。
class custclass:
custid1 = 0
custid2 = 1
custid3 = 2
customer = custclass()
print(customer.custid1)
print(customer.custid2)
delattr(custclass, 'custid3')
print(customer.custid3)
実行結果
上記のコードを実行すると、次のような出力が得られます。
0 Traceback (most recent call last): 1 File "xxx.py", line 13, in print(customer.custid3) AttributeError: 'custclass' object has no attribute 'custid3'
このように、削除済みの属性へアクセスするとAttributeErrorが発生することが確認できます。
del()の使い方
続いて、delステートメントによる属性の削除方法を見ていきましょう。delattr()とは構文が異なり、ドット記法で属性を直接指定する点に注意してください。
構文: del オブジェクト名.属性名 オブジェクト名: クラスからインスタンス化されたオブジェクトの名前 属性名: 削除したい属性の名前
サンプルコード
先ほどと同じ例を、今度はdelステートメントを使って実行します。delattr()との構文の違いに注目してください。
class custclass:
custid1 = 0
custid2 = 1
custid3 = 2
customer = custclass()
print(customer.custid1)
print(customer.custid2)
del(custclass.custid3)
print(customer.custid3)
実行結果
上記のコードを実行すると、次のような出力が得られます。
0 1 Traceback (most recent call last): File "xxx.py", line 13, in print(customer.custid3) AttributeError: 'custclass' object has no attribute 'custid3'
delattr()とdel()の違いまとめ
両者の主な違いは以下のとおりです。
- delattr(): 属性名を文字列として渡すため、変数に格納した属性名を使って動的に削除できる。属性名を実行時に決定したい場合に有効。
- del: ドット記法で属性を直接指定するため、コードの意図が明確になり、動作もわずかに高速。削除対象がコード上で固定されている場合に適している。
用途に応じてこの2つを使い分けることで、より読みやすく保守性の高いPythonコードを書くことができます。
-
Pythonの「==」と「is」演算子の違いをわかりやすく解説
「==」と「is」の基本的な違い Pythonには、オブジェクトを比較するための方法として「==」演算子と「is」演算子の2つがあります。一見すると似たような働きをするように見えますが、この2つはまったく異なる目的を持っています。 「==」(等価演算子)は、2つの変数の値が等しいかどうかを比較します。一方、「is」(同一性演算子)は、2つの変数が同じオブジェクト(同じメモリ上の場所)を参照しているかどうかを確認します。 サンプルコード 以下のコードは、「==」と「is」の動作の違いを示すシンプルな例です。ここでは空のリストを扱っています。list1とlist2はそれぞれ独立した別々の空のリスト
-
Pythonで例外メッセージをキャプチャして出力する方法
Pythonでは、発生した例外のメッセージをさまざまな方法でキャプチャし、出力することができます。以下に2つのコード例を示します。最初の例では、例外オブジェクトが持つ message 属性を使用しています。例1:message属性を使う方法try: a = 7/0 print float(a) except BaseException as e: print e.message出力integer division or modulo by zeroこのコードでは0による除算が行われたため ZeroDivisionError が発生し、そのメッセージ「integer di