2012-12-13 4 views
5

Sto scrivendo un sacco di attività che sono molto simili, e voglio sapere come sottoclasse meglio lo Task per ridurre lo schema. Dal momento che un compito viene solo instillato una volta, non è possibile inserire le cose in __init__ come mostrato di seguito, ma dovrebbe illustrare il punto.sottoclasse sedano Compito

quello che sto cercando di realizzare:

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 

Quello che vorrei avere è:

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

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

Quindi, dal momento che __init__ è proprio fuori, dove si imposta la classe nel classe astratta. Posso definire un gruppo di funzioni abbastanza facilmente se tutto quello che voglio fare è prendere in considerazione alcune cose, ma alcune (molte) regole sono dipendenti da object_id.

+0

possibile duplicato del [compito sedano e personalizzare decoratore] (http://stackoverflow.com/questions/6393879/celery-task- and-customize-decorator) – Louis

+0

Mentre la soluzione è applicabile - la domanda posta è diversa. In quanto tale, non penso che sia un duplicato. Se stavo cercando di aumentare l'ESSENZIALITÀ dei miei compiti usando mixin e sottoclassi di compiti, non sarei alla ricerca di "personalizzare decoratore", ma "sottoclasse" o "mixin" o qualcosa del genere. – yarbelk

risposta

6

La risposta mia e di Mauro Rocco ti può aiutare?

vedere celery task and customize decorator

Non sono riuscito a passare gli argomenti a una task esteso

+0

Anche se non mi piace accettare le risposte ai link, la sua è una buona risposta. in breve - sovrascrivi il metodo '__call__' invece di' __init__' – yarbelk

+0

È un link alla mia risposta ... è adatto anche qui –