2014/08/08

Python Tips:オブジェクトにメソッドを追加したい

Python で、既存のオブジェクトにメソッドを追加する方法をご紹介します。

既存のオブジェクトにメソッドを追加する方法は 2 通りあります。

  1. そのオブジェクトのクラスのインスタンスメソッドを追加する
  2. そのオブジェクトだけにインスタンスメソッドを追加する

以下そのそれぞれについて方法を見ていきましょう。


そのオブジェクトのクラスのインスタンスメソッドを追加する


こちらはオブジェクト生成の前でも後でもどちらでもよいので、そのオブジェクトが所属するクラスのプロパティを追加します。

次のコードではこのアプローチで Dog クラスのインスタンス pochi の生成後にインスタンスメソッドを追加しています。

# クラスを定義しインスタンスを生成
class Dog(object):
    pass

pochi = Dog()

# 追加したいメソッドを関数として定義しクラスのプロパティに追加
def count(self):
    print("one! one!")

Dog.count = count

# 追加したメソッドが生成済みのオブジェクトからも利用できる
pochi.count()  # => one! one!


そのオブジェクトだけにインスタンスメソッドを追加する


もう一方のこちらは、クラス全体ではなくひとつのオブジェクトだけにメソッドを追加する方法です。

これは Ruby でいうところの「特異メソッド」的な位置づけのものになるでしょうか。

このアプローチを使うには types ライブラリの MethodType を利用します。
次のコードも上掲のコードと同じく pochi オブジェクトにメソッドを追加していますが、このメソッドは pochi 限定のものとなっています。

 
# MethodTypes を利用するために import
import types

# Dog クラスを定義しインスタンス pochi を生成
class Dog(object):
    pass

pochi = Dog()

# pochi に追加したいメソッドを関数として定義
def count(self):
    print("one! one!")

# count メソッドを実際に追加
pochi.count = types.MethodType(count, pochi)

# 追加したメソッドが生成済みのオブジェクトからも利用できる
pochi.count()  # => one! one!

# 同じクラスのインスタンスからはもちろん利用できない
Dog(object).count()  # AttributeError

・・・以上です。


参考

python - Adding a Method to an Existing Object - Stack Overflow
types — Names for built-in types — Python 公式ドキュメント

0 件のコメント: