2012-12-13 42 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

这是一个链接到我自己的答案...它也适合在这里 –