Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

selfの話

メソッドのself (2)について少し書いてみる。

pythonの不満点でよく上がる定番の話は

  1. self地獄
  2. インデント地獄
  3. GIL外せよ!

なんだけどそのうちのひとつであるselfの話。
まあ死ぬほど聞く話ではあるけど。

多分和訳より原文の方を読むと掴めるんじゃないかな。

decoratorがなぜ問題になるか?って部分だけど。
decoratorってある意味ブラックボックスでなんでもできちゃうので自動でboundさせるのむずくね?みたいな話なのかなと。

def deco(fun):
    def meth(self, arg):
        self.val = "decorator"
        return self.val
    return meth

class C(object):

    @deco
    def meth(self, arg):
        self.val = arg 
        return self.val

c = C() 
print(c.meth(1))
print(c.val)

渡したfuncを無視するなんてあんまし書かないコードではあるが。
(wrapするケースは多いよね)

selfなしを考える。
decorator内で関数を作ってそいつをメソッドのように振る舞わせる時にselfってどこから持ってこよう?
selfを無くす方向で書くと

def deco(fun):
    def meth(arg):
        #このselfって??  
        self.val = "decorator"
        return self.val
    return meth

class C(object):

    @deco
    def meth(arg):
        self.val = arg 
        return self.val

c = C() 
print(c.meth(1))
print(c.val)

将来的にあるクラスのメソッドになりえるものを関数として定義しちゃうケースだとself何を指すのか?
関数でself???関数だよ?
ということになっちゃうよね?って話。
selfがあるからこそpythonのメソッドのbound、unboundがぬるく適当でも動いてくれる。
だからこそdecoratorみたいな関数を返す関数でクラスのメソッドを拡張できるわけだな。

pythonのメソッドのbound、unboundみたいな話は前にも書いたけど以下の書籍に割と書いてあるので
読むといいと思う。

Pythonクィックリファレンス

Pythonクィックリファレンス

追記
selflessをmetaclassでやっちゃう話があったので紹介。自分のAttribute舐めてまわるというよくあるコード。
Meta-classes Made Easy
selfless-pythonは死亡してる模様です。。。