3 回答

TA貢獻1712條經(jīng)驗 獲得超3個贊
你的懷疑是對的。6 個月前我也有同樣的疑問,我的一個朋友幫我找出了答案。
print("Middle",x,y)
以上說法不屬于任何方法。它屬于類Exp。該__init__()方法在創(chuàng)建對象時執(zhí)行,并在從您端實例化對象時由 Python 解釋器在內(nèi)部調(diào)用。由于上述語句不是任何方法的一部分,解釋器在調(diào)用__init__方法之前執(zhí)行它。由于變量x和y都在 class 的范圍內(nèi)可用Exp,因此它不被視為錯誤,解釋器會執(zhí)行它。
如果您刪除變量x和的聲明y,您將看到NameError如下所示。
Traceback (most recent call last):
File "trial.py", line 9, in <module>
print("Middle",x,y)
NameError: name 'x' is not defined
這是因為x并且y甚至不是從 classExp的角度創(chuàng)建的。

TA貢獻1817條經(jīng)驗 獲得超6個贊
發(fā)生這種奇怪的行為是因為您print("Middle",x,y)不在函數(shù)的定義中,所以它被調(diào)用 before print("Out",x,y)。
您的代碼相當(dāng)于:
x = 5
y = 3
class Exp(object):
def __init__(self, x, y):
self.x = x
self.y = y
print("In",x, y, self.x, self.y)
print("Middle",x,y)
print("Out",x,y)
Exp(1,2)
誰的輸出將是:
Middle 5 3
Out 5 3
In 1 2 1 2
糾正此問題的一種可能方法是print("Middle",x,y)在構(gòu)造函數(shù)中定義 。
x = 5
y = 3
class Exp(object):
def __init__(self, x, y):
self.x = x
self.y = y
print("In",x, y, self.x, self.y)
print("Middle",x,y)
print("Out",x,y)
Exp(1,2)
然后您將獲得的輸出是:
Out 5 3
In 1 2 1 2
Middle 1 2

TA貢獻1860條經(jīng)驗 獲得超9個贊
類方法不會在編譯時執(zhí)行,它們必須被調(diào)用。
上面的代碼中的 print(middle) 語句未在類方法中定義。而 print(In) 語句是在init(也稱為構(gòu)造函數(shù))方法中定義的。
當(dāng)您運行代碼并且編譯器運行腳本時,在調(diào)用init () 方法之前不會調(diào)用 print(In) 語句。
但是,此 print(middle) 行并未定義為 Exp 類的方法,而是作為內(nèi)置函數(shù)執(zhí)行,盡管有空格。因此,當(dāng) Python 編譯 Exp 類時,會調(diào)用 print(middle) 語句。這是唯一一次調(diào)用 print(middle) 語句。由于它不在類方法中,因此以后無法在程序中訪問它。
如果您嘗試下面的代碼,您會得到輸出“Out”和“In”。您只能通過調(diào)用 Exp.test() 獲得“中間”
x = 5
y = 3
class Exp(object):
def __init__(self, x, y):
self.x = x
self.y = y
print("In",x, y, self.x, self.y)
def test(self):
print("Middle",x,y)
print("Out",x,y)
Exp(1,2)
添加回答
舉報