2012-04-03 48 views
3

我有限的理解是types.FunctionTypes(dict)的第二个参数决定了函数代码可用的内容。我很好奇它是如何在内部实例化函数时得到决定的。为了说明我的意思,如果我尝试动态复制一个函数:什么是和不可用的类方法在python中?

a = 'test' 
def foo(): 
    print(a) 

bar = types.FunctionType(
    foo.__code__, 
    globals(), 
    'bar', 
    foo.__defaults__, 
    foo.__closure__ 
) 

这似乎与globals(),但我错过了什么吗?更令人困惑的是类方法。如果我做这样的事情:

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', ...) 

这个例子的工作原理,但不是这个更复杂的一个:

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'>] 

不出所料,这是它在定义的类我不知道的创建一个新的cell对象的简单方式除了使用exec,创建一个新的类和方法。你可能会复制新的单元格到其他方法以添加到新类中,但单元格和类都是全新的。

+0

这绝对是这个谜题的一部分,一旦我想出了如何创建一个闭包并将其传入,'超(Foo,self)'工作。但不是'super()'。人力资源管理。 – colinmarc 2012-04-03 17:21:02

相关问题