我開始看到一些結構是這樣的:何時在模塊中執行語句?
class Foo:
def someFunc1:
...
def someFunc2:
...
bar = 2 + 2
def someFunc3:
...
當將bar
獲得在這個例子中執行?
我開始看到一些結構是這樣的:何時在模塊中執行語句?
class Foo:
def someFunc1:
...
def someFunc2:
...
bar = 2 + 2
def someFunc3:
...
當將bar
獲得在這個例子中執行?
在類聲明當模塊被加載:在這種情況下
>>> class Foo:
... def someFunc1(self):
... pass
... def someFunc2(self):
... pass
... bar = 2 + 2
... def someFunc3(self):
... pass
...
>>> Foo.bar
4
bar
將被認爲是一類屬性。它可以作爲課程本身的屬性以及該課程的實例訪問:
以下是兩個幫助您理解的示例。
訪問的類的屬性:訪問的類的實例
class Foo(object):
stuff = "hello"
Foo.stuff # will hold hello
:
f = Foo()
f.stuff # will hold "hello"
對象後已經從類中創建它會被執行時對象的屬性'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)
bar
是一個類變量和它得到在即在模塊類定義時執行水平。
類定義爲一個可執行語句。它首先評估 繼承列表(如果存在)。繼承列表中的每個項目應該 評估爲允許子類化的類對象或類類型。然後使用新創建的本地名稱空間和原始全局名稱空間,在新的執行框架中執行類的套件。 (通常,該套件僅包含功能 定義。)當類的套件完成執行時,其執行 幀被丟棄,但其本地名稱空間被保存。 然後使用基類 的繼承列表和屬性字典的已保存本地名稱空間創建對象 。 類的名稱在原始本地名稱空間中綁定到此類對象。
當輸入一個類定義,一個新的命名空間創建,並作爲當地的範圍 - 因此,局部變量的賦值去 到這個新的命名空間。
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
之前'someFunc3'被定義(和'定義之前Foo'結束),但是someFunc2'被定義後'。在方法定義之前放置類屬性是很常見的,除非有其他的好理由。 – jonrsharpe