在芹菜任务中使用超级



我有一些基类,例如:

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

的装饰器

您正在混合两种方法:类方法(@classmethod)和实例方法(def calculate_price(self):)。

我没有真正在代码中尝试过此操作,但是:

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)
    @classmethod
    def calculate_price(cls, task_self):
        super(BMW, cls).calculate_price()

因此,首先将@classmethod装饰器应用于def calculate_price(...):,然后将@celery.task应用于类方法。

如果您确实需要calculate_price()作为实例方法,则签名可能为def calculate_price(self, task_self):,但是当您已经拥有一个实例时,需要应用装饰器,例如:

my_car = BMW()
celery.task(my_car.calculate_price)

当您使用instance<dot>method访问方法时,您没有得到您编写的功能,您会得到一个方法描述符,当调用时,它将照顾填写第一个参数(self),而留给您填写其余参数。在这种情况下,只有task_self参数,@celery.task Decorator会照顾那个。

无论如何,我认为您应该退后一步,并以更通用的方式重新考虑您的问题,而不是弄清楚如何将类/实例方法与芹菜联系起来。通常,芹菜任务应该只是生活在应用程序中的模块中的功能,该功能接受可以使用JSON轻松序列化的参数。

相关内容

  • 没有找到相关文章

最新更新