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となっていて、関数で定義してもクラス定義の中で定義する場合と全く同じようにメソッドが定義できることが分かります。