第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

python類的執(zhí)行順序

python類的執(zhí)行順序

阿晨1998 2022-01-18 16:25:58
我正在編寫一個小的 python 腳本來理解一個概念,但又遇到了另一個困惑。這是代碼 -x = 5y = 3class 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 3Out 5 3In 1 2 1 2現(xiàn)在,我的概念是 python 解釋器開始讀取和執(zhí)行從第一行到最后一行的代碼。它僅在“調(diào)用”時執(zhí)行類中的代碼,而不是在定義時執(zhí)行。因此,輸出應(yīng)首先打印“Out”。但在這里它首先打印“中間”。這不應(yīng)該發(fā)生,因為 python 解釋器在第一次遇到“中間”時 - 它在定義內(nèi),因此不應(yīng)該在那個時候執(zhí)行。它應(yīng)該僅在讀取調(diào)用“Exp”類的最后一行代碼后執(zhí)行。我在 Google 和 StackOverflow 上搜索了解決方案,但找不到為課程解釋它的解決方案。請幫助我理解我在哪里弄錯了......
查看完整描述

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)建的。


查看完整回答
反對 回復(fù) 2022-01-18
?
慕的地6264312

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


查看完整回答
反對 回復(fù) 2022-01-18
?
慕碼人2483693

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)


查看完整回答
反對 回復(fù) 2022-01-18
  • 3 回答
  • 0 關(guān)注
  • 433 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號