我有一些基类,例如:
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轻松序列化的参数。