Pythonのメソッドは普通は次のようにクラス定義の中でdef
文を記述して定義します。(コードは全てPython3です。)
class Foo:
def __init__(self, name):
self.name = name
def print_name(self):
print(self.name)
# Fooのインスタンスを作成
foo = Foo('foo')
ですが、クラスを定義した後に普通の関数をクラスの外に書いて、その関数をクラスの属性にセットすることでも定義することができます。この方法で、上記のprint_name
メソッドをクラスの外で定義した場合、次のようになります。
class Bar:
def __init__(self, name):
self.name = name
# Barのインスタンスを作成
bar = Bar('bar')
def print_name(self):
print(self.name)
Bar.print_name = print_name
foo
とbar
のprint_name
の動作と型を比較してみると、次のように出力されます。
>>> foo.print_name()
foo
>>> bar.print_name()
bar
>>> foo.print_name
<bound method Foo.print_name of <__main__.Foo object at 0x03C83610>>
>>> bar.print_name
<bound method Bar.print_name of <__main__.Bar object at 0x042F5D10>>
foo
でもbar
でもprint_name
の型はbound method
となっていて、関数で定義してもクラス定義の中で定義する場合と全く同じようにメソッドが定義できることが分かります。