我有一些基類,如:芹菜任務使用超級
class Auto(object):
_year = None
_base_price = None
@classmethod
def calculate_price(cls):
return cls._base_price + 5000 * (2016 - cls._year)
class BMW(Auto):
_year = 2015
_base_price = 40000
@celery.task(filter=task_method,
name='queue_name',
base=basetask(), bind=True)
def calculate_price(self):
super(BMW, self).calculate_price()
所以,我的問題是與代碼的最後一行,它提出: TypeError: super(type, obj): obj must be an instance or subtype of type
我試圖刪除bind=True
和玩一點它,但沒有結果。任何想法如何解決這個問題?
UPDATE: 其中
celery = Celery(...)
所以,我使用的裝飾像app.task
通常可以看到任務裝飾器與函數一起使用,而不是方法。我並不是說它不能完成,但很少見。討論如何將任務行爲放在類中的資源很多(例如https://blog.balthazar-rouberol.com/celery-best-practices),但任務裝飾器仍然適用於普通函數。也許你可以用這種方式簡化你的設計。相關:http://stackoverflow.com/questions/9250317/using-class-methods-as-celery-tasks – FMc
@FMc,我已經讀過這兩個主題。在那裏沒有這種情況。我真的需要基礎類,並在子類中運行一些方法作爲任務芹菜。所以我需要以某種方式解決我的問題,而不需要更改架構 – smart
是的,在這些主題中或者在任何Celery文檔中都沒有像您這樣的情況,因爲我不認爲Celery支持使用任務裝飾器一個方法。你需要使用一個功能。特別是,在我提供的StackOverflow鏈接中,請注意來自Hamy的評論。它看起來像你目前的設計根本無法工作。 – FMc