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

Pythonのダンダー(マジック)メソッドとは?__repr__や__add__の使い方を実例で解説

Pythonには、オブジェクト指向プログラミングにおいて便利な「技」を可能にするマジックメソッド(ダンダーメソッド)が用意されています。これらのメソッドは、名前の前後に二重のアンダースコア(__)が付いているのが特徴です。特定の条件が満たされたときに自動的に呼び出されるインターセプター(割り込み処理)として機能します。

代表的なものとして、__repr__はオブジェクトの「公式な」文字列表現を返す組み込みメソッドであり、一方の__str__は「非公式な」(人間が読みやすい)文字列表現を返す組み込みメソッドです。

基本例:通常のクラス定義

まず、マジックメソッドを定義していないシンプルなクラスを見てみましょう。

class String:
   # オブジェクトを初期化するマジックメソッド
   def __init__(self, string):
      self.string = string

# ドライバーコード
if __name__ == '__main__':
   # オブジェクトの生成
   my_string = String('Python')
   # オブジェクトを出力
   print(my_string)

出力結果

<__main__.String object at 0x000000BF0D411908>

__repr__を定義していないため、出力されるのはオブジェクトのメモリ上の場所を示す文字列です。これは人間にとってあまり有用な情報ではありません。

__repr__で文字列表現をカスタマイズする

次に、__repr__メソッドを追加してみます。

class String:
   # オブジェクトを初期化するマジックメソッド
   def __init__(self, string):
      self.string = string

   # 文字列オブジェクトを整形して表示
   def __repr__(self):
      return 'Object: {}'.format(self.string)

# ドライバーコード
if __name__ == '__main__':
   # オブジェクトの生成
   my_string = String('Python')
   # オブジェクトを出力
   print(my_string)

出力結果

Object: Python

print()関数が呼ばれると自動的に__repr__が実行され、オブジェクトの内容を分かりやすい形式で表示できるようになりました。これがマジックメソッドの基本的な仕組みです。

文字列を連結しようとするとどうなるか

次に、このオブジェクトに対して文字列を「+」演算子で連結してみます。

class String:
   # オブジェクトを初期化するマジックメソッド
   def __init__(self, string):
      self.string = string

   # 文字列オブジェクトを整形して表示
   def __repr__(self):
      return 'Object: {}'.format(self.string)

# ドライバーコード
if __name__ == '__main__':
   # オブジェクトの生成
   my_string = String('Python')
   # Stringオブジェクトと文字列を連結
   print(my_string + ' Program')

出力結果

TypeError: unsupported operand type(s) for +: 'String' and 'str'

エラーが発生しました。「+」演算子はデフォルトでは自作クラスに対応していないためです。ここで登場するのが__add__メソッドです。

__add__で演算子オーバーロードを実現する

Stringクラスに__add__メソッドを追加してみましょう。

class String:
   # オブジェクトを初期化するマジックメソッド
   def __init__(self, string):
      self.string = string

   # 文字列オブジェクトを整形して表示
   def __repr__(self):
      return 'Object: {}'.format(self.string)

   # + 演算子の動作を定義
   def __add__(self, other):
      return self.string + other

# ドライバーコード
if __name__ == '__main__':
   # オブジェクトの生成
   my_string = String('Hello')
   # Stringオブジェクトと文字列を連結
   print(my_string + ' Python')

出力結果

Hello Python

__add__を定義することで、「+」演算子が使われるたびにこのメソッドが自動的に呼び出され、正常に文字列連結が行えるようになりました。

まとめ

マジックメソッド(ダンダーメソッド)を使うと、オブジェクトの表示方法(__repr____str__)や演算子の挙動(__add__など)を自由にカスタマイズできます。Pythonのクラス設計において非常に強力な仕組みなので、ぜひ活用してみてください。

  1. 【Python入門】タイムスタンプを日時オブジェクトに変換する方法をわかりやすく解説

    Pythonでは、標準ライブラリの datetime モジュールに含まれる fromtimestamp() 関数を使うことで、UNIXタイムスタンプ(エポック秒)から日時オブジェクトへ簡単に変換できます。この関数はタイムスタンプを引数として受け取り、それに対応する datetime オブジェクトを返します。 基本の使い方:fromtimestamp() 以下の例では、UNIXタイムスタンプ「1500000000」を日時オブジェクトに変換し、読みやすい形式の文字列として出力しています。 import datetime timestamp = datetime.datetime.fromtime

  2. 【Python入門】strptimeを使って日付文字列をdateオブジェクトに変換する方法

    Pythonでは、datetimeモジュールのstrptime関数を使うことで、文字列形式の日付データを簡単にdatetimeオブジェクトへ変換できます。この関数には、変換したい日付の文字列と、その日付がどのような書式で記述されているかを示すフォーマット指定子の2つの引数を渡します。基本的な使い方(サンプルコード)以下の例では、「2017年12月29日」という日付が「29122017」という文字列として表現されている場合に、それを日付オブジェクトへ変換しています。import datetime date_str = 29122017 # 日付文字列(2017年12月29日) format