python下記URL内にあるRubyのalias_method_chainのようなことをしたいと思っています。

http://wota.jp/ac/?date=20060503

少しでもスマートに実現できる方法があれば教えてください。

回答の条件
  • 1人2回まで
  • 登録:2009/10/20 22:57:28
  • 終了:2009/10/21 19:07:19

ベストアンサー

id:mattn No.1

mattn回答回数104ベストアンサー獲得回数232009/10/21 00:36:30

ポイント35pt

http://mattn.kaoriya.net/

URLはダミーです。

こんなのではダメでしょうか?

class A:
    def dan(self, x):
        return x+1
a = A()

print a.dan(1) # 2
A.__dict__['kogai'] = lambda self,x: x+2
print a.kogai(1) # 3

もちろん lambda でなくても良いですが。

id:webrecdotjp

回答ありがとうございます。

この例でいうと、

print a.dan(1) # 4 => (x+1)+2として解釈

を出すようにしたいです。

2009/10/21 09:20:35

その他の回答(1件)

id:mattn No.1

mattn回答回数104ベストアンサー獲得回数232009/10/21 00:36:30ここでベストアンサー

ポイント35pt

http://mattn.kaoriya.net/

URLはダミーです。

こんなのではダメでしょうか?

class A:
    def dan(self, x):
        return x+1
a = A()

print a.dan(1) # 2
A.__dict__['kogai'] = lambda self,x: x+2
print a.kogai(1) # 3

もちろん lambda でなくても良いですが。

id:webrecdotjp

回答ありがとうございます。

この例でいうと、

print a.dan(1) # 4 => (x+1)+2として解釈

を出すようにしたいです。

2009/10/21 09:20:35
id:mattn No.2

mattn回答回数104ベストアンサー獲得回数232009/10/21 12:38:11

ポイント35pt

こんな感じでしょうか?

class A:
  def dan(self, x):
    return x+1
setattr(A, "old_dan", A.dan)
setattr(A, "dan", lambda self,x: self.old_dan(x)+1)

a = A()
print a.dan(1)
id:webrecdotjp

回答ありがとうございます。

setattrで定義すればいけそうですね。

def alias_method_chain( foo, bar)
    setattr(A, "foo_without_bar",  foo)
    setattr(A, "foo_with_bar", lambda self:  (self.foo_without_bar, self.bar)  )
    setattr(A, "foo",  foo_with_bar)

って感じで定義したいですが、これってどうかけば動くんですかね。

2009/10/21 16:51:30
  • id:mattn
    あまりやりたい事が分かっていないのですが、リンク先の動作をやるならば...
    >|python|
    def alias_method_chain(clazz, lhs, name):
    setattr(clazz, "%s_without_%s" % (lhs.func_name, name), lhs)
    setattr(clazz, lhs.func_name, getattr(clazz, "%s_with_%s" % (lhs.func_name, name)))
    ||<
    >|python|
    class A:
    def dan(self):
    print "dan"

    class B(A):
    def dan_with_kogai(self):
    self.dan_without_kogai()
    print "kogai"

    alias_method_chain(B, A.dan, "kogai")
    B().dan()
    ||<
    こんな感じでしょうか?alias_method_chainがクラス定義に内包出来ないのは少し悲しいですが...
  • id:mattn
    インデントが崩れたのでgistに貼っておきます。
    http://gist.github.com/214994
  • id:webrecdotjp
    回答ありがとうございます!
    >alias_method_chainがクラス定義に内包出来ないのは少し悲しいですが...
    たしかに。。。残念ですね〜。

    今回の質問で、大変勉強になりました!
    細かい所までおつきあいいただきありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません