2009-09-15 4 views
3

私はPythonに問題があります: メソッドを別のクラスからオブジェクトに割り当てたいが、このメソッドでは独自の属性を使用する。私は私のプロジェクト(その例ではない)で異なる使用方法を持つ多くのコンテナを持っているので、継承を使用したくないので、各インスタンスのカスタムクラスを作成しなければなりません。メソッドの代入とオブジェクト

class container(): 
    def __init__(self): 
     self.info = "undefiend info attribute" 

    def use(self): 
     print self.info 


class tree(): 
    def __init__(self): 

     # create container instance 
     b = container() 

     # change b's info attribute 
     b.info = "b's info attribute" 

     # bound method test is set as use of b and in this case unbound, i think 
     b.use = self.test 

     # should read b's info attribute and print it 
     # should output: test: b's info attribute but test is bound in some way to the tree object 
     print b.use() 

    # bound method test 
    def test(self): 
     return "test: "+self.info 


if __name__ == "__main__": 
    b = tree() 

ありがとう、これを読んで、おそらく私を助けてくれてありがとう! :)

答えて

2

ここに行きます。 self.testはすでにバインドされていることを知っておく必要があります。これは、__init__の時点ですでにインスタンスが作成され、そのメソッドがバインドされているからです。したがって、im_funcメンバを使用し、MethodTypeでバインドして、アンバウンドメンバにアクセスする必要があります。

import types 

class container(): 
    def __init__(self): 
     self.info = "undefiend info attribute" 

    def use(self): 
     print self.info 


class tree(): 
    def __init__(self): 

     # create container instance 
     b = container() 

     # change b's info attribute 
     b.info = "b's info attribute" 

     # bound method test is set as use of b and in this case unbound, i think 
     b.use = types.MethodType(self.test.im_func, b, b.__class__) 

     # should read b's info attribute and print it 
     # should output: test: b's info attribute but test is bound in some way to the tree object 
     print b.use() 

    # bound method test 
    def test(self): 
     return "test: "+self.info 


if __name__ == "__main__": 
    b = tree() 
+0

ありがとうございました。ありがとうございました。ありがとうございました。タイプとメソッドタイプについてもう少し詳しくお知りになりたいと思います。しかし、あなたのソリューションはとてもうまく動作します! – blackforestcowboy

+0

@blackforestcowboy:この知識は黒い魔法ですので、あなたはそれについて知っているとは思いません。私がチェックした最後の時間はどこにも書かれていません。私はプラグインシステムを作ろうとしているときに自分自身を発見しました。自己記述されたPythonの専門家はすべて答えを出すのではなく、私に質問することができないと私に言っていました。 – Unknown

+0

@知られていない:はい、黒い魔法が好きです! ;)私は、types.MethodType packackeのために調べてみましたが、それについての情報を簡単に見つけることができました。私はまたPluginSystemのようなものを書こうとしているので、継承は書くよりもずっと多くのコードでしょう。もう一度ありがとうございます。 – blackforestcowboy

1

あなたは継承を使用しようとしていますか?木はコンテナから継承していますか?

1

self.testの代わりにtree.testを使用します。インスタンスのメソッド属性は、そのインスタンスにバインドされます。

1

動的にメソッドを移動しないでください。

委任を使用してください。マジックを避ける。

"ツリー"オブジェクトをコンテナに渡します。メソッドを移動しようとするのを節約します。

class Container(object): 
    def use(self, context): 
     print context.info 
     context.test() 

class Tree(object): 
    def __init__(self, theContainerToUse): 
     b= theContinerToUse(self) 
     print b.use() 
    def test(self): 
     print "test"+self.info 
+0

@ S.Lottあなたのソリューションをありがとう、現時点で私はそれが私を助ける方法を得ることはありませんが、私は現時点で仕事中ですので、悲しいかなくJavaに対処しなければなりません...しかし、確かに考えています仕事の後!ありがとうございました! – blackforestcowboy

+0

@ S.Lottいいえ、そのpythonの質問ではなく、java!この質問はプライベートプロジェクトに関するものですが、私はPythonでプログラムしていますが、仕事では、私はJavaで作業しなければなりません。混乱させて申し訳ありません!これは間違いなくpythonの質問です! – blackforestcowboy