Вие смесвате два стила методи: методи на клас (@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
ще се погрижи за него.
Във всеки случай, мисля, че трябва да се отдръпнете и да преосмислите проблема си по по-общ начин, вместо да измисляте как да свържете методите на клас/инстанция към Celery. Като цяло задачите на Celery трябва да бъдат само функции, живеещи в модул във вашето приложение, които приемат параметри, които могат лесно да бъдат сериализирани с помощта на JSON.
person
Armando Pérez Marqués
schedule
06.03.2017
app.task
като документация за Celery 4.X предложен. Ето защо мога да съм сигурен, че поддържа засега - person smart   schedule 02.01.2017