为什么Python类定义不能将闭包变量赋值给自身?
为什么下面的代码在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中,如果没有加上global
或nonlocal
的声明,赋值的变量名只在当前的范围内有效。这种情况不仅在函数中会发生,在类的定义中也会出现。
这意味着你不能同时使用相同的名字来表示全局变量和局部变量,并且想要同时使用它们。你可以参考Aaron Digulia的回答中的解决方法,或者使用不同的名字:
def make_class(_a):
class A(object):
a = _a
return A