python中的类方法有什么和不可用?

时间:2012-04-03 16:01:59

标签: python

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

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中的内容吗?什么是类方法可用,什么不可用?

我并没有特别试图让上面的代码工作,我更倾向于解释它为什么没有。

1 个答案:

答案 0 :(得分:0)

问题似乎是“复制”__closure__属性不会创建副本;这是函数体(def __init__)本身被执行的执行上下文;支持python语言中的词法作用域规则。看一看:

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

不出所料,它是它定义的类。除了使用cell之外,我不确定创建新exec对象的简单方法,以创建新的类和方法;您可以将新单元格复制到要添加到新类的其他方法中,但单元格和类都将是全新的。