2012-12-13 279 views
5

我正在寫很多非常類似的任務,並且想知道如何更好地繼承Task以減少樣板。由於一個任務只有一次安裝,所以我不能像下面展示的那樣把東西放在__init__,但它應該說明這一點。子類化芹菜任務

什麼,我試圖完成:

class EmailTaskOne(Task): 
    def run(self, object_id): 
     email_data = EmailData.objects.get(pk=object_id) 
     data = self.do_common_stuff(email_data) 
     self.do_unique_stuff(data) 

class EmailTaskTwo(Task): 
    def run(self, object_id): 
     email_data = EmailData.objects.get(pk=object_id) 
     data = self.do_common_stuff(email_data) 
     self.do_unique_stuff2(data) 

# lots more tasks like this 

我想什麼有是:

class BaseEmailTask(Task): 
    abstract = True 
    #...Insert Magic Here... 

class EmailTaskOne(BaseEmailTask): 
    def run(self, object_id): 
     self.do_unique_stuff(self.data) 

那麼,既然__init__是正確的,我在哪裏設置類的抽象類。我可以很容易地定義一堆函數,如果我想要做的是將一些東西分解出來,但是一些(大量)樣板依賴於object_id。

+0

可能重複http://stackoverflow.com/questions/6393879/celery-task-和定製修飾器) – Louis

+0

雖然解決方案適用 - 問的問題是不同的。因此,我不認爲它是重複的。如果我試圖通過使用mixin和sublcassing任務來增加DRYness的任務 - 我不會尋找'customize decorator',而是'subclass'或'mixin'或類似的東西。 – yarbelk

回答

6

我的和MauroRocco的回答能幫助你嗎?

看到celery task and customize decorator

有我成功傳遞參數給擴展任務

[芹菜任務和定製裝飾(的
+0

雖然我不喜歡接受鏈接回覆,但他是一個很好的答案。總之 - 覆蓋'__call__'方法而不是'__init__' – yarbelk

+0

這是一個鏈接到我自己的答案...它也適合在這裏 –