2012-12-13 43 views
5

Tôi đang viết rất nhiều nhiệm vụ rất giống nhau và muốn biết cách phân lớp Task tốt hơn để giảm bớt bản mẫu. Vì một nhiệm vụ chỉ được instatiated một lần, tôi bạn không thể đặt những thứ trong __init__ như tôi hiển thị dưới đây, nhưng nó nên minh họa điểm.phân lớp cần tây Nhiệm vụ

những gì tôi đang cố gắng để hoàn thành:

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 

Những gì tôi muốn làm là:

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

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

Vì vậy, kể từ __init__ là đúng ra, nơi nào tôi thiết lập các lớp trong lớp trừu tượng. Tôi có thể định nghĩa một loạt các hàm khá dễ dàng nếu tất cả những gì tôi muốn làm là tính ra một số thứ, nhưng một số (rất nhiều) của boilerplate phụ thuộc vào object_id.

+0

thể trùng lặp của [nhiệm vụ cần tây và tùy chỉnh trang trí] (http://stackoverflow.com/questions/6393879/celery-task- và tùy chỉnh-trang trí) – Louis

+0

Trong khi giải pháp có thể áp dụng - câu hỏi được đặt ra là khác nhau. Như vậy, tôi không nghĩ rằng nó là một bản sao. Nếu tôi đã cố gắng để tăng DRYness của nhiệm vụ của tôi bằng cách sử dụng mixins và sublcassing nhiệm vụ - Tôi sẽ không được tìm 'tùy chỉnh trang trí', nhưng 'subclass' hoặc 'mixin' hoặc một cái gì đó như thế. – yarbelk

Trả lời

6

Câu trả lời của tôi và MauroRocco có giúp ích cho bạn không?

thấy celery task and customize decorator

Ở đó tôi đã thành công để vượt qua đối số cho một công tác mở rộng

+0

Mặc dù tôi không thích chấp nhận các phản hồi liên kết, nhưng đó là câu trả lời hay. trong ngắn hạn - ghi đè phương pháp '__call__' thay vì' __init__' – yarbelk

+0

Đó là một liên kết đến câu trả lời của riêng tôi ... nó cũng phù hợp ở đây –

Các vấn đề liên quan