我對這種行為感到困惑,
def calc():
print ("function .. calculating")
class Calc:
print ("Class .. calculating")
生成此輸出:
類..計算
為什么即使我們沒有呼叫它或創建物件,類中的代碼也會被執行,而函式中的代碼在我們呼叫它之前不會被執行?
uj5u.com熱心網友回復:
該陳述句不是類中任何方法__init__或任何方法的一部分。由于這個陳述句不是任何方法的一部分,解釋器在呼叫__init__方法之前執行它(在這種情況下是隱式的)。呼叫該__init__方法意味著當__init__您創建此類的物件時呼叫該方法。這就是為什么它列印出來的原因。
還有一個好點,當您實體化物件時,這將被執行多次。因為只有當解釋器獲取類定義時,它才會執行一次。(來自與 Iain Shelvington 的討論)
從這個輸出中會更清楚。
class Calc:
print ("Class .. calculating")
print(ab) #throws error
def __init__(self):
print('init')
在這種情況下,如果ab不早于使用,??則會引發錯誤。非常重要的是:它所屬的命名空間,檢查這個:
class Calc:
print ("Class .. calculating")
ab=2
def __init__(self):
print('init')
print(ab) #throws error
現在它會再次拋出錯誤。因為它是在類中宣告的。但是您可以實體化類的物件并將其作為類范圍的一部分進行訪問。
class Calc:
print ("Class .. calculating")
ab=2
def __init__(self):
print('init')
calc = Calc()
calc.ab # 2
您可以查看此內容以供進一步參考。我只想強調這個范圍所涉及的微妙之處
當一個類定義正常離開時(通過結束),一個類物件被創建。這基本上是對類定義創建的命名空間內容的包裝;我們將在下一節中了解更多關于類物件的資訊。原始的本地范圍(在輸入類定義之前生效的那個)被恢復,并且類物件在此處系結到類定義標題中給出的類名(示例中的 ClassName)。
uj5u.com熱心網友回復:
我完全同意蒂姆·羅伯茨的觀點。我不是這里的專家,但對于下面的特定用例,這種行為很有用。
class Foo:
bar = 'Baz'
print(Foo.bar)
這樣,您可以存盤一些資料,而無需實體化它來使用底層資料。但是,如果您想在類實體上使用它,它也是可用的。
f = Foo()
print(f.bar)
uj5u.com熱心網友回復:
這就是語言的設計方式。定義類時執行類主體。您可以在檔案中閱讀更多內容:9.3.1。類定義語法
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/470315.html
