Ruby、Pythonでクラスのインスタンスメソッドを追加する

ちょっと前まではrubyで、最近はpythonで仕事をしているので、rubyでやっていたアレ、pythonだとどうやるんだろ?と思うことがたまにあります。


で、クラスへのインスタンスメソッド追加ですが、
rubyではオープンクラスによって、インスタンスメソッドが追加できます

以下はメタプログラミングRubyで紹介されている例で、Stringクラスにメソッドを追加してます

class String
    def to_alphanumeric
        gsub /[^\w\s]/, ''
    end
end

"#3, the *Magic Number?*".to_alphanumeric
# => => "3 the Magic Number"


pythonではビルトインクラスにメソッドを追加することはできません
こんなエラーになります

TypeError: can't set attributes of built-in/extension type 'str'


ビルトインクラスでないならば、関数の参照を代入することができます

class Person():
   def __init__(self, name):
        self.name = name


gushiken = Person('gushiken')
me = Person('yuhei')

def greeting(self):
      print("hello, my name is %s." % self.name)

Person.greeting = greeting

me.greeting()
gushiken.greeting()

strに振るまいを追加したい場合は、strのサブクラスを作成する、というのがpython wayなんだと思います。たぶん。

メタプログラミングRuby

メタプログラミングRuby