2017-03-21 70 views
0

我有兩個文件,一個聲明一個涉及涉及子類的方法的超類,另一個定義子類。在Python中的兩個不同文件中聲明一個類和子類

文件1:

from file2 import subclass 

class superclass: 
    def __init__(self): 
     "Stuff" 

    def method(self): 
     temp = subclass() 
     "Stuff" 

文件2:

from file1 import superclass 

class subclass(superclass): 
    def __init__(self): 
     "Stuff" 

當我運行文件1的代碼中,我得到一個錯誤的內部文件2即超沒有定義。這是因爲我在定義超類之前先導入file2。

但是,如果我在定義超類後導入file2,我會在file1中得到一個錯誤,說明子類沒有定義。這是因爲我在方法中使用了一個子類實例。

解決此問題的一個辦法是在一個文件中同時存在超類和子類聲明,但我想知道是否有辦法讓它們在不同的文件中聲明。

+0

您不能像這樣進行循環導入。您不能將file1導入file1,file2導入file1。爲什麼必須file2導入file1? –

+0

@Bryan Oakley在你聲明子類之前,子類是否需要定義超類? – Keagan

+0

是的,它的確如此。你必須在定義一個子類之前定義一個超類 –

回答

0

從方法獲得temp並覆蓋該子類中的該方法。

class superclass: 
    def get_temp(self): 
     return 'a superclass temp' 

    def method(self): 
     temp = self.get_temp() 
     print(type(self).__name__, repr(temp)) 

class subclass(superclass): 
    def get_temp(self): 
     return 'a subclass temp' 


superclass().method() 
subclass().method() 

輸出:

superclass 'a superclass temp' 
subclass 'a subclass temp' 

如果您需要在method()subclass不同或前或後superclass.method()也許做了一些工作,使用super關鍵字。

+0

儘管我需要超類方法內的子類的一個實例。這樣做,如果我做superclass.method()該方法將不會內部使用一個子類實例。 – Keagan

+0

'self'是通過'subclass()。method()' – Harvey

+0

調用的'subclass'的一個實例,或者如果您需要一個全新的'subclass'實例,您可以這樣做:'instance = type(self)( )' – Harvey

0

你可以包括以下行到您的文件2:

if superclass in locals(): print pass 
else: 'Please define superclass' 

像這樣:

文件2:

from file1 import superclass 

class subclass(superclass): 
    if superclass in locals(): pass 
    else: print 'Please define superclass' 
    def __init__(self): 
     "Stuff" 

現在嘗試運行文件1 NOT文件2。它會提示'請定義超類'。但是這個子類已經被註冊了。一旦你運行類似於:

​​

子類可行。

+0

謝謝!我能夠得到它的工作。 – Keagan

+0

添加了兩條線還是您獲得了不同的解決方案。如果您有不同的解決方案,請與我們分享。 謝謝:) –

0

的問題是容易的,如果你看一下如何Python的負載模塊明白:

  1. 您運行python file2.py
  2. Python加載​​並開始執行它。
  3. Python解析from file1 import superclass
  4. Python加載file1.py並開始執行它。
  5. Python解析from file2 import subclass
  6. 由於file2已經加載,Python試圖訪問file2.subclass
  7. Python尚未解析類聲明,因此subclass尚不存在。這導致ImportError

只要第二次導入時已經解析了類,Python就可以處理循環依賴。有兩種方法可以獲得:

1)在方法本身中導入file2

class superclass: 
    def __init__(self): 
     "Stuff" 

    def method(self): 
     from file2 import subclass 
     temp = subclass() 
     "Stuff" 

這會導致當method被稱爲首次,而不是在導入/加載file1發生的進口。 缺點是每次調用method時都會有一些運行時間開銷,並且您必須確保在之後method()僅被稱爲導入file1已完成。

2)在file1的末尾輸入file2而不使用from import

class superclass: 
    def __init__(self): 
     "Stuff" 

    def method(self): 
     temp = file1.subclass() 
     "Stuff" 

import file2 

這樣的file2圓形進口發生在superclassfile1命名空間已經存在。那時file2的名稱空間不完整(file2.subclass還不存在,所以from file2 import subclass會失敗),但只要method在導入成功之前從不調用,它就可以工作。缺點是您需要跟蹤哪些導入語句需要位於文件的底部,哪些需要位於頂部。任何錯誤都會導致ImportErrors,如果您的模塊層次結構變得更加複雜,那麼可能很難追蹤。

也就是說,你應該真的重做你的類層次結構。循環進口(如上所述)非常脆弱,通常應避免。

相關問題