【发布时间】:2017-05-15 16:51:32
【问题描述】:
我有一些基类,例如:
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 并尝试使用它,但没有任何结果。任何想法如何解决这个问题?
更新: 在哪里
celery = Celery(...)
所以,我正在使用像 app.task 这样的装饰器
【问题讨论】:
-
通常会看到与函数一起使用的任务装饰器,而不是方法。我并不是说它不能完成,但它很少见。有很多资源讨论如何将您的任务行为放在一个类中(例如blog.balthazar-rouberol.com/celery-best-practices),但任务装饰器仍然应用于普通函数。也许您可以通过这种方式简化您的设计。同样相关:*.com/questions/9250317/…
-
@FMc,我已经阅读了这两个主题。那里没有我这样的案例。我真的需要基础类并在子类中运行一些方法作为任务芹菜。所以我需要在不改变架构的情况下以某种方式解决我的问题
-
是的,在这些主题或任何 Celery 文档中都没有像您这样的案例,因为我认为 Celery 不支持针对方法使用任务装饰器。你需要使用一个函数。特别是,在我提供的 * 链接中,请注意 Hamy 的评论。看来您当前的设计根本行不通。
-
@FMc,我已经更新了一些我的问题......我将我的装饰器用作
app.task作为 celery 4.X 提议的文档。这就是为什么我可以肯定它现在支持
标签: python oop celery celery-task