2009-09-18 63 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

相關問題