2012-08-17 67 views
2

我的問題是關於我有包含和這個類裏面有一串代碼會被執行進口,而不執行類 - 蟒蛇

所以每當我導入該文件將執行的文件!無需創建類的對象! ,這裏是例子

FILE X

class d: 
    def __init__(self): 
     print 'print this will NOT be printed' 
    print "this will be printed" 

文件B

import x 

輸出爲this will be printed,所以我的問題是如何跳過執行,直到創建新對象?

+2

「如何跳過執行,直到創建一個新的對象」 - 爲什麼不把它放在另一個'__init__'中? – mgilson 2012-08-17 17:13:33

+1

爲什麼不直接在'__init__'方法中放置第二個'print'?我認爲'__init__'可能是你要找的東西,因爲根據定義,代碼是在創建對象 – 2012-08-17 17:13:38

+0

上運行的,因爲真實的類比示例中的真實類大得多,所以它很難重新修改它 – Hamoudaq 2012-08-17 17:18:35

回答

2

你不能在Python中做到這一點,在Python中,每個類都是第一級對象,Python類也是一個對象,即使沒有該類的實例,也可以存在類屬性。如果您只想禁止輸出打印語句,則可以在輸入時重定向打印語句的輸出,或者創建一個類似於this first answer中提供的語境並手動使用__import__語句。

0

(從上面的情況下,它是未來的讀者有用的評論複製)

同意@mgilson和@EmmettJButler - 這個代碼很可能最好放置在__init__。當Python導入模塊時,它會執行模塊級代碼,包括使用類方法等構建類定義。因此,當您建立了import Xclass d的定義(因此您可以從B中調用它)時,它會執行該類內部的代碼。通常這意味着您將設置類級變量集和未綁定的方法以準備連接到實例,但在您的情況下,這意味着您的語句將被打印。

正如其他人所建議的那樣,重構代碼可能是您最好的選擇。

0

如果你想要做的就是導入過程中抑制打印(或任何其他可執行語句),與頂層模塊執行的檢查包圍他們:

if __name__ == '__main__': 
    print 'this will be printed' 

這將防止在導入過程中的打印,但當模塊爲 交互執行時允許。

+0

它不工作,我試圖創建一個對象,但它不打印語句 – Hamoudaq 2012-08-17 22:47:00

+0

要獲得打印行,我執行:python -i x.py.爲了抑制打印,我執行了:python -i b.py.請顯示您嘗試過的代碼,並讓我知道您是如何調用它的。 – stleary 2012-08-17 22:59:09

+0

OP希望知道「如何跳過執行它直到創建新對象」,而不取決於模塊是否已被導入。我不知何故直到現在才錯過了我自己。 – martineau 2012-08-17 23:47:26

0

正如其他人指出的那樣,第二個print陳述正在執行,因爲它是構成類聲明的一組語句中的一個 - 當它們所在的模塊是imported時,所有這些語句都會執行,因爲聲明是part它的頂級代碼是嵌套在函數或方法中的。

第一個print語句沒有執行,因爲它是方法定義的一部分,它的語句只有在被調用之後纔會執行 - 與類定義中的不同。通常,當使用班級名稱創建班級的實例時,會間接調用班級的__init__()方法,對於像您的名爲d的班級,該班級的名稱將爲d()

因此,雖然它與顯示的字符串文本中的內容相矛盾,但要使第二個print語句僅在創建類的實例時執行(就像第一個類一樣),您還需要使其成爲部分相同的方法(或由它調用)。換句話說,在這樣做之後,當類所在的文件是imported時,它們都不會執行,但是在創建類的任何實例時都會執行。這就是我的意思是:

文件x.py

class d: 
    def __init__(self): 
     print 'print this will NOT be printed' # not true 
     print "this will be printed when object is created" 

文件b.py

import x # no print statements execute 
obj = d() # both print statements will be executed now 
0

你的問題是這樣的:我有一個函數

def f(): 
    print(1) 
    print(2) 

如何使打印(1)已執行,但未打印(2)?真的沒有簡單的方法。你必須明白的是def __init__(self)也是一個聲明。你的課程由該陳述和打印陳述組成。執行一個而不是其他的簡單方法。當然,如果您可以更改課程的來源,只需在__init__的內部打印它,它將在實例創建後調用。