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
にどうあるべきかを照らすだろうか?クラスメソッドには何があり、何がありませんか?
私は具体的に上記のコードを実行しようとしているわけではありませんが、私はそれがなぜそうでないのかの説明を探しています。
これは間違いなくパズルの一部です。閉包を作成して渡す方法を理解したら、 'super(Foo、self)'が動作します。 'super()'ではありません。 hrm。 – colinmarc