Python
 Computer >> コンピューター >  >> プログラミング >> Python

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コードを書くことができます。

  1. Pythonの「==」と「is」演算子の違いをわかりやすく解説

    「==」と「is」の基本的な違い Pythonには、オブジェクトを比較するための方法として「==」演算子と「is」演算子の2つがあります。一見すると似たような働きをするように見えますが、この2つはまったく異なる目的を持っています。 「==」(等価演算子)は、2つの変数の値が等しいかどうかを比較します。一方、「is」(同一性演算子)は、2つの変数が同じオブジェクト(同じメモリ上の場所)を参照しているかどうかを確認します。 サンプルコード 以下のコードは、「==」と「is」の動作の違いを示すシンプルな例です。ここでは空のリストを扱っています。list1とlist2はそれぞれ独立した別々の空のリスト

  2. 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