我有一些基类,如:芹菜任务使用超级
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