2016-04-24 93 views
3

我正在努力處理多個文件中的繼承類的定義。跨文件的類繼承

我搜索了很長時間,並找到了一些例子,但沒有解決我的問題。

讓我們深入到一個例子:

file1.py:

from file2 import SubClass 

class MainClass: 
    def __init__(self): 
    print("This is MainClass") 

mc = MainClass() 
mc.SaySomething() 

file2.py:

from file1 import MainClass 

class SubClass(MainClass): 
    def SaySomething(self): 
    print("This is the subclass") 

我的目標是一個巨大的類分成多個文件,每個文件包含一些相關的功能。

我試了很多不同的組合,但總是得到一個錯誤 - 當我改變一些當然,但結果是相同的,這是不同的;它不起作用。

我想這與我試圖將每個文件導入對方的方式有關,但我還沒有想出如何去做,所以我希望有人能解決它,並向我解釋。

實際上第三個文件是將導入主類並執行它。我猜這個文件只需要導入file1.py,因爲它會導入file2 - 否則請糾正我。

好的,這是第一部分。但是,我也很好奇,如果我可以在對象中創建一些多個嵌套的模塊/函數 - 對於結構的緣故。

我很確定一個例子會更好地解釋它。我可以製造類似於:

mc = MainClass() 
mc.SubClass.SaySomething() 

...而不是僅僅是mc.SaySomething()?我想,這樣我可以保持更好的代碼結構。

+0

這被稱爲循環導入。在file1中,您導入了smth。從file2開始,反之亦然。這幾乎總是表明你應該改變你的設計。 – schwobaseggl

+3

'從file2導入SubClass'不需要,你沒有使用'SubClass' –

+0

我不確定file1.py應​​該知道如何定義一個子類? –

回答

-1

我明白你想要做什麼,你不應該這樣做。

也許你想要做的多重繼承,我希望你用下面的例子理解:

class A: 
    def __init__(self, number): 
     self.number = number 

    def increase(self): 
     self.number += 1 

class B: 
    def __init__(self, number): 
     self.number = number 

    def decrease(self): 
     self.number -= 1 

class AB(A, B): 
    def __init__(self, number): 
     self.number = number 

ab = AB(10) 
ab.increase() 
print ab.number 

通過這種方式,您可以在diferent文件分割你的類,然後做一個MainClass,但我不」我認爲這將是最好的方式。

+0

請注意,循環導入在Python中是可能的。 – mwm314

0

你可以重構你的代碼,使多個類最小化依賴(作爲他們可以得到的獨立)。然後,而不是繼承嘗試組成。這意味着使用鴨子打字而不是親子關係。繼承路線將不起作用,因爲這意味着奇怪的循環導入。所以,

# a.py 
class A: 
    # some code 
# b.py 
import a 
class B: 
    aobj = a.A() 
    # go on using aobj 

但是,相反的這一切,你應該總是喜歡重新審視你的設計,清洗起來,使之成爲更具可讀性。此外,也可能發生這樣的情況,即如果部分代碼在經過一些檢查後發現不相關,那麼看起來很大的類可能會被幹淨地分割成多個塊。