2015-09-27 101 views
2

我開始看到一些結構是這樣的:何時在模塊中執行語句?

class Foo: 
    def someFunc1: 
      ... 
    def someFunc2: 
      ... 

    bar = 2 + 2 

    def someFunc3: 
      ... 

當將bar獲得在這個例子中執行?

+0

之前'someFunc3'被定義(和'定義之前Foo'結束),但是someFunc2'被定義後'。在方法定義之前放置類屬性是很常見的,除非有其他的好理由。 – jonrsharpe

回答

0

在類聲明當模塊被加載:在這種情況下

>>> class Foo: 
...  def someFunc1(self): 
...   pass 
...  def someFunc2(self): 
...   pass 
...  bar = 2 + 2 
...  def someFunc3(self): 
...   pass 
... 
>>> Foo.bar 
4 
0

bar將被認爲是一類屬性。它可以作爲課程本身的屬性以及該課程的實例訪問:

以下是兩個幫助您理解的示例。

訪問的類的屬性:訪問的類的實例

class Foo(object): 
    stuff = "hello" 

Foo.stuff # will hold hello 

f = Foo() 
f.stuff # will hold "hello" 
-1

對象後已經從類中創建它會被執行時對象的屬性'bar'被調用。

class Foo(): 
    def someFunc1(): 
     pass 

    def someFunc2(): 
     pass 

    bar = 2 + 2 

    def someFunc3(): 
     pass 

obj = Foo() 
print(obj.bar) 

如果沒有對象被從類則它可以直接從類訪問創建:

class Foo(): 
    def someFunc1(): 
     pass 

    def someFunc2(): 
     pass 

    bar = 2 + 2 

    def someFunc3(): 
     pass 


print(Foo.bar) 
0

bar是一個類變量和它得到在即在模塊類定義時執行水平。

Class Definition docs:

類定義爲一個可執行語句。它首先評估 繼承列表(如果存在)。繼承列表中的每個項目應該 評估爲允許子類化的類對象或類類型。然後使用新創建的本地名稱空間和原始全局名稱空間,在新的執行框架中執行類的套件。 (通常,該套件僅包含功能 定義。)當類的套件完成執行時,其執行 幀被丟棄,但其本地名稱空間被保存。 然後使用基類 的繼承列表和屬性字典的已保存本地名稱空間創建對象 。 類的名稱在原始本地名稱空間中綁定到此類對象。

當輸入一個類定義,一個新的命名空間創建,並作爲當地的範圍 - 因此,局部變量的賦值去 到這個新的命名空間。

In [1]: class Foo(object): 
    .....:  bar = 1 
    .....:  

In [2]: Foo.__dict__ 
Out[2]: <dictproxy {'__dict__': <attribute '__dict__' of 'Foo' objects>, 
     '__doc__': None, 
     '__module__': '__main__', 
     '__weakref__': <attribute '__weakref__' of 'Foo' objects>, 
     'bar': 1}> # bar class variable 

In [3]: Foo.bar 
Out[3]: 1