2011-09-12 60 views
4

我有一個泛型類(A)這是被繼承了很多像這樣運行:避免如果__name__ ==「__main__」在Python子類使用功能從父

class A: 
    def run(self): 
     ... 
     self.do_something() 
     ... 

    #abstract function 
    def do_something(self): 
     pass 


class B(A): 
    def do_something(self): 
     ... 

子類是我正在通過將此代碼添加到每個文件直接運行單獨的文件(B是子類的文件名):

if __name__ == '__main__': 
    B().run() 

我的問題是,我能避免這個代碼添加到所有文件與子類,因爲代碼中唯一改變的是正在使用的類(在這個例子中是B)?

+0

順便說一句,你可以用'@ abc.abstractmethod'強制執行的要求,即'do_something' _actually_是抽象的。 – katrielalex

+0

是的,我知道,我真的使用它,只是不想讓這個例子比需要的更復雜......但反正! – fvieira

回答

8

如果您的python版本足夠新,您可以創建一個類裝飾器。

在這種情況下,一個間接的。如果你定義runifmain()集中的地方

def runifmain(mainname): 
    def deco(clas): 
     if mainname == '__main__': 
      clas().run() 
     return clas 
    return deco 


@runifmain(__name__) 
class B(A): 
    [...] 

應該做的工作,只是使用@runifmain(__name__)任何需要它。

+0

非常有趣,我之前使用過裝飾器,但並不認爲它們很容易使用。儘管如此,除非有方法將裝飾器放入類A中,否則我仍然必須在每個子類文件中添加導入和裝飾器,這聽起來不像以前那麼簡單。如果我的聲望足夠高,這還是值得我高興的! xD – fvieira

+0

我現在有足夠的聲望,有你的投票!再次! – fvieira

+0

thx :-)但是你只需要將裝飾器放在一個文件中,並且可以將它導入到單個文件中。如果你用'@ staticmethod'裝飾它,甚至應該有一種方法將它放入類定義本身。 – glglgl

2

如何在主類A中添加額外的功能?

class A(): 
    .. 
    def __RunIfMain__(self,name): 
     if name == '__main__': 
      self.run() 

在子類中,你就必須一行少:

class B(A): 
    .. 

B().__RunIfMain__(__name__) 
+1

嗯,你讓我少了一行,這是肯定的,但從glglgl的答案裝飾看起來更性感...... xD 反正! – fvieira

相關問題