【发布时间】:2012-12-01 04:02:06
【问题描述】:
我正在编写很多非常相似的任务,并且想知道如何更好地继承 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。
【问题讨论】:
-
虽然解决方案适用 - 提出的问题不同。因此,我不认为它是重复的。如果我试图通过使用 mixins 和 sublcassing 来增加我的任务的 DRYness - 我不会寻找“自定义装饰器”,而是“子类”或“mixin”或类似的东西。
标签: python django celery django-celery