为什么Python类定义不能为自己分配闭包变量?

joe*_*ker 2 python closures

为什么以下不能在Python中工作?

def make_class(a):
    class A(object):
        a=a
    return A
Run Code Online (Sandbox Code Playgroud)

Sil*_*ost 9

工作得很好:

>>> def make_class(a):
    class A(object):
        _a=a
    return A

>>> make_class('df')
<class '__main__.A'>
>>> make_class('df')._a
'df'
Run Code Online (Sandbox Code Playgroud)

顺便说一句,function不是Python中的保留关键字.

  • @joeforker,所以接受SilentGhost的答案! - ) (3认同)

yai*_*chu 6

让我们使用一个更简单的例子来解决同样的问题:

a = 'something'
def boo():
    a = a
boo()
Run Code Online (Sandbox Code Playgroud)

这会失败,因为python中的赋值没有伴随globalnonlocal声明,意味着指定的名称是当前作用域的本地名称.这不仅发生在函数中,也发生在类定义中.

这意味着您不能对全局变量和局部变量使用相同的名称并同时使用它们.您可以使用Aaron Digulia的答案中的解决方法,或使用其他名称:

def make_class(_a):
    class A(object):
        a = _a
    return A
Run Code Online (Sandbox Code Playgroud)