は、私のようないくつかの基本クラスがあります。使用してスーパーが
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:クラスメソッド(@classmethod
)、およびインスタンスメソッド(def calculate_price(self):
):
celery = Celery(...)
ので、私はあなたがメソッドの2つのスタイルを混合している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