2012-04-03 16 views
3

types.FunctionTypes(dict)の2番目の引数は、機能コードで使用できるものを決定するということを私は理解しています。私は、内部的に関数をインスタンス化するときに、どうやってそれが決まるのか不思議です。私が何を意味するかを説明するために、関数を動的にコピーしようとすると、次のようになります:globals()では問題なく動作していますが、何も見当たりません。もっと混乱するのはクラスメソッドです。Pythonでメソッドをクラス化することはできますか?

a = 'test' 

class Foo(object): 
    b = 'Foo prints this' 

    def myfunc(): 
     print(a, self.b) 

Bar = type('Bar', tuple(), dict()) 
Bar.b = 'Bar prints this' 

ns = globals() 
#should I do ns.update(something) here? 

f = Foo.myfunc 
Bar.myfunc = types.FunctionType(f.__code__, ns, 'myfunc', ...) 
例が機能することを

が、これより複雑ではない1:私はこのような何かを行う場合は

import imp 
import builtins 

class Foo(object): 
    def __init__(self): 
     super().__init__() # super(Foo, self) also fails 

mod = imp.new_module('test') 
mod.__builtins__ = builtins 
mod.Foo = type('Foo', tuple(), dict()) 

f = Foo.__init__ 
ns = {} 
ns.update(mod.__dict__) #missing something here 

mod.Foo.__init__ = types.FunctionTypes(f.__code__, ns, '__init__', ...) 

誰かがnsにどうあるべきかを照らすだろうか?クラスメソッドには何があり、何がありませんか?

私は具体的に上記のコードを実行しようとしているわけではありませんが、私はそれがなぜそうでないのかの説明を探しています。

答えて

0

この問題は、__closure__属性の「コピー」がコピーを作成しないことが原因と思われます。これは、関数本体()自体が実行された実行コンテキストです。 Python言語のレキシカルスコープ規則をサポートしています。 。見て撮影:当然のことながら

>>> [cell.cell_contents for cell in f.__closure__] 
[<class '__main__.Foo'>] 

を、それが中で定義されたクラスは、私は新しいクラスやメソッドを作成するには、execを使ってほかの新しいcellオブジェクトを作成するための簡単な方法のかわからないのです。おそらく、新しいクラスを新しいクラスに追加する追加のメソッドにコピーすることができますが、セルとクラスの両方が新しいものになります。

+0

これは間違いなくパズルの一部です。閉包を作成して渡す方法を理解したら、 'super(Foo、self)'が動作します。 'super()'ではありません。 hrm。 – colinmarc