为什么Python类定义不能将闭包变量赋值给自身?

2 投票
4 回答
913 浏览
提问于 2025-04-15 14:25

为什么下面的代码在Python中不管用呢?

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

4 个回答

2

这两种方法看起来都能正常工作(至少在Python 2.5中是这样):

>>> def make_class(a):
...     class A(object):
...             _a = a
...     return A
... 
>>> make_class(10)._a
10
>>> def make_class(b):
...     class B(object):
...             def get_b(self):
...                     return b
...     return B
... 
>>> make_class(10)().get_b()
10
9

运行得很好:

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

>>> make_class('df')
<class '__main__.A'>
>>> make_class('df')._a
'df'

顺便说一下,function 这个词在Python里并不是一个保留字。

7

我们来用一个更简单的例子来说明同样的问题:

a = 'something'
def boo():
    a = a
boo()

这个例子会失败,因为在Python中,如果没有加上globalnonlocal的声明,赋值的变量名只在当前的范围内有效。这种情况不仅在函数中会发生,在类的定义中也会出现。

这意味着你不能同时使用相同的名字来表示全局变量和局部变量,并且想要同时使用它们。你可以参考Aaron Digulia的回答中的解决方法,或者使用不同的名字:

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

撰写回答