2017-09-07 19 views
0

我怎樣才能在類的方法定義中引用一個類的共享?如何在類的方法定義中引用一個類的授權?

例如:

>>> class C: 
...  a = 3 
...  def f(self): 
...   # nonlocal a # nonlocal doesn't work                                        
...   # a = 4 # create a local variable a in f                                        
...   self.a = 4 
... 
>>> c=C() 
>>> C.a 
3 
>>> c.a 
4 

我怎麼可以參考C.aC.f的定義是什麼?

  • 目前self.a = 4將創建c.a這是從C.a不同。

  • 如果self.a = 4替換a = 4a將在C.f一個局部變量,而不是C.a

  • nonlocal a不作afC.a,我不知道爲什麼?

謝謝。


更新:

在類的定義,我什麼時候有資格的屬性,我當不得?舉例來說,我不明白爲什麼以下是錯誤的:

>>> class C: 
...  C.b=4 
... 
>>> C.b 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: type object 'C' has no attribute 'b' 
>>> C.C.b 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: type object 'C' has no attribute 'C' 
+0

簡單。使用'C.a = 4'。 –

+0

根據您的更新:這是相當深奧的。當你說「C.b = 4」時,「C」還不存在。您沒有收到錯誤,因爲您在執行此代碼之前已經定義了不同的「C」類。輸入「del C」然後再試一次,你會得到一個錯誤。您正在更新舊的「C」類的類變量,然後使用新的C類重新定義它。 – RobertB

回答

2

您需要使用類本身:

C.a = 4 

或潛在

self.__class__.a = 4 
+0

謝謝。當我用'a = 3'定義'C.a'時,爲什麼我不必把它寫成'C.a = 3'?所以在一個類的定義裏面,我何時可以引用它的沒有限定符和點的屬性,以及我什麼時候需要? – Ben

+0

在創建類對象之前,'a'被初始化並綁定到名稱'C'。在創建類對象後調用__init__,並且'class'語句不會創建對'__init__'主體可見的作用域。 – chepner

+0

當你在類中定義'a'時,它會被添加到類的名字空間中。這是合理的。當你在方法內部賦值'a'時,你需要使用類名稱空間來解決它。 –

相關問題