2012-06-27 55 views
3

道歉,如果這沒有意義,我不是一個有經驗的程序員。繼承與python模塊導入中的類實例

考慮下面的代碼:

import mymodule 

class MyClass: 
    def __init__(self): 
     self.classInstance = myModule.classInstance() 

,然後......

from mymodule import classInstance 

class MyClass(classInstance): 
    def __init__(self): 
     pass 

如果我只是想用MyClass中的一個Children子,是確定導入特定從模塊類,並有MyClass繼承這個類?

在決定這兩種方法時,是否有任何最佳實踐或者我應該考慮的事情?

非常感謝

+3

這更是一個OOP問題。 Google for ** isa vs hasa **。 [也檢查此](http://stackoverflow.com/questions/453738/inheritance-or-composition-rely-on-is-a-and-has-a) – tuxuday

+0

謝謝,這有助於很多 – Sherlock

回答

6

請允許我提出一個不同的例子。

想象一下Vector類。 現在你想要一個類的點。點可以用向量來定義,但也許它具有Vector不具有的其他額外功能。 在這種情況下,您從Vector中派生Point。

現在你需要一個Line類。 一條線不是上述任何類的專門化,所以可能你不想從它們中任何一個派生出來。 但是Line使用點。在這種情況下,你可能要開始你行類是這樣的:

class Line(object): 
    def __init__(self): 
     self.point1 = Point() 
     self.point2 = Point() 

凡點將是這樣的:

class Point(Vector): 
    def __init__(self): 
     Vector.__init__(self) 

所以答案是真的:取決於你需要做什麼,但當你對自己的編碼有清晰的認識時,比在分類之間進行選擇變得顯而易見。

我希望它有幫助。

0

你讓這聽起來像你想這兩個方法來「之間的選擇」,但他們這樣做完全不同的事情。第二個定義了一個從類(易混淆)繼承的類,調用classInstance。第一個定義了名爲MyClass的類(不是從基類obect類型以外的任何類繼承),該類具有名爲self.classInstance的實例變量,該實例變量恰好設置爲classInstance類的實例。

你爲什麼叫你的班級classInstance

+0

這兩個例子上面給MyClass訪問classInstance。我想我的問題是,哪一個最適合在wha情況下使用? – Sherlock

+0

不是。一個給MyClass訪問(通過繼承)到* class *,稱爲'classInstance'。一個給MyClass訪問(通過屬性)一個* classInstance的*實例*。 – BrenBarn