2009-09-18 60 views

回答

6

让我们用一个简单的例子对于同样的问题:

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

失败的原因是在Python任务,没有伴随globalnonlocal声明,表示该分配的名称是本地的当前范围。这不仅发生在函数中,而且发生在类定义中。

这意味着您不能为全局变量和本地变量使用相同的名称并将它们同时使用。您可以使用替代方法从亚伦Digulia的答案,或者使用不同的名称:

def make_class(_a): 
    class A(object): 
     a = _a 
    return A 
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 
+0

我试图做A = A类中,如在默认的函数参数,那是行不通的。 – joeforker 2009-09-18 15:48:51

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中并不是一个保留关键字。

+1

我的不好。我知道Python,诚实! – joeforker 2009-09-18 15:47:18

+3

@joeforker,所以接受SilentGhost的答案已经! - ) – 2009-09-18 16:49:13

2

尝试

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

错误你得到(NameError: name 'a' is not defined)是因为在类名a阴影参数的功能a;因此在代码中尝试“a = a”时没有定义a。换句话说,右边a不是a来自def;相反,Python在类A中查找它,因为a已在作业左侧提到。

这变得更加干净,功能:

x = 1 
def a(x): 
    print 'a:',x 
    x = 3 
    def b(): 
     print 'b:',x 
    b() 
a(2) 
def c(): 
    x = x 

显然,第一印刷应打印2,而不是1,所以参数的ax绝影全局变量xbx被称为a的参数的范围内定义,因此打印工作正常。

但是,如果您尝试致电c,则会得到UnboundLocalError: local variable 'x' referenced before assignment,因为Python不会自动绑定全局变量。要解决此问题,您必须在分配前添加global x

你的情况大致如下:

x = 1 
def a(x): 
    print 'a:',x 
    x = 3 
    def b(): 
     x = x 
     print 'b:',x 
    b() 
a(2) 

虽然印刷x在上面的例子中的工作,任务不工作。这是确保变量不泄漏的安全措施。解决的办法是使用默认参数设置为“复制”变到b的范围:

x = 1 
def a(x): 
    print 'a:',x 
    x = 3 
    def b(x=x): 
     x = x 
     print 'b:',x 
    b() 
a(2) 

解决你的问题,你需要告诉Python的‘使参数的Amake_class可见a’和在尝试分配课程的a字段之前,您需要这样做。这在Python中是不可能的。如果你可以使a可见,那么赋值会改变参数,而不是字段,因为Python无法区分这两个。

由于您无法将其显示,因此没有a可读,因此NameError

请参阅here了解Python中名称范围的解释。

+2

-1您将得到该代码的语法错误,因为您打开类A并且不缩进以下行。放入一个缩进的通行线,你会没事的。 – 2009-09-18 16:16:53

+0

糟糕。添加了缺少的“通行证”。 – 2009-09-21 07:09:17

相关问题