selfの話
メソッドのself (2)について少し書いてみる。
pythonの不満点でよく上がる定番の話は
- self地獄
- インデント地獄
- 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みたいな話は前にも書いたけど以下の書籍に割と書いてあるので
読むといいと思う。
- 作者: アレックスマーテリ,Alex Martelli,クイープ
- 出版社/メーカー: オライリージャパン
- 発売日: 2004/03/01
- メディア: 単行本
- 購入: 2人 クリック: 158回
- この商品を含むブログ (25件) を見る
追記
selflessをmetaclassでやっちゃう話があったので紹介。自分のAttribute舐めてまわるというよくあるコード。
Meta-classes Made Easy
selfless-pythonは死亡してる模様です。。。