2011-06-14 23 views
0

我需要編寫一個基類(在本例中爲類A),它可能但不總是被分類。我只想調用基類中的'Run'方法,只要它沒有子類別,否則只調用子類中的'Run'方法。只調用基類,如果它不是Python的子類

這是我的,它似乎工作,但我想知道如果有一個更容易或更Pythonic的方式。

class A(object): 
    def __init__(self): 
     pass 

    def Run(self): 
     print "Calling A.Run()" 

class B(A): 
    def __init__(self): 
     A.__init__(self) 
     pass 

    def Run(self): 
     print "Calling B.Run()" 


subs = A.__subclasses__() 

if subs: inst = [i() for i in subs] 
else: inst = [A()] 

[each.Run() for each in inst] 

回答

1

你有什麼看起來是正確的,但大多數程序員會看着B.運行方法,並認爲:「哦,他忘了打電話超級。讓我補充一下......」但我相信你會解釋你在做什麼真正的實施:)

如果你'不用擔心C++中的切片,然後放心。你有什麼是好的。

至於讓它「更容易」,我不確定除了從B的__init__刪除A空的__init__函數和刪除pass之外,我不確定如何簡化它。

+0

實際實現中'__init __()'方法中可能存在實際代碼。我只是包括'傳遞'版本,以確保我做得正確:) – tMC 2011-06-14 23:05:31

1

我想打電話給僅從如果它不子類的基類中的「運行」方法,否則只能調用從子類中的「運行」方法。

這是默認情況下發生的情況,最具體的方法被調用。

如果你真的不想基本方法是從子類,你可以寫這樣的事情:

class C(object): 
    def Run(self): 
     if self.__class__ != C: 
      raise NotImplementedError("You need to override this method") 
+0

如果我導入基類,然後導入可能繼承它的任何類;如果我導入的東西沒有從它導出,我仍然需要調用基類(A.Run())方法,直到我導入所有東西之前,我不知道是否有任何子類。 – tMC 2011-06-14 23:02:24

相關問題