サブクラスが関数の名前で属性を設定できるようにするクラスを記述する必要があります。その関数は、クラスのインスタンスから呼び出し可能でなければなりません。Pythonでコールバックを受け付けるクラスを記述していますか?
たとえば、サブクラスがウェルカムメッセージで渡すことができるFruitクラスを記述する必要があるとします。 Fruitクラスは、設定可能な属性print_callbackを公開する必要があります。
class Fruit(object):
print_callback = None
def __init__(self, *args, **kwargs):
super(Fruit, self).__init__(*args, **kwargs)
self.print_callback("Message from Fruit: ")
が、私はこのコードによって消費することができているAPIを公開する必要があります(明確にするために、このコードは、それがあると言う、変更することはできません、サードパーティのコード):
def apple_print(f):
print "%sI am an Apple!" % f
class Apple(Fruit):
print_callback = apple_print
私が実行している場合:
mac = Apple()
私が取得したい:
Message from Fruit: I am an Apple!
は、代わりに私が取得:
TypeError: apple_print() takes exactly 1 argument (2 given)
私は自分が最初の引数として渡されているので、これがあると思います。
どのようにしてFruitクラスを書くことができますか?ありがとう!
を私はあなたがこのアプローチと、以下の優れたソリューションを持ってきた問題を感謝しています。しかし、これは 'print_callback'をメソッド(単に' print_me'と呼んで、それをオーバーライドするサブクラスを取得すること)として定義する必要があるように思えます。それは単純でpythonicになります。異なる種類の 'print_me'メソッドごとに異なるサブクラスを作成してください。 –
私は、Google App Engineのgoogle.appengine.ext.db.djangoforms(DF2など)をサブクラス化して、DjangoのModelForm(django.forms.ModelForm)と同じ方法で属性formfield_callbackを上書きできるようにしたかった)。つまり、スーパークラスをdjango.forms.ModelFormに変更するだけで、標準のDjangoでは 'class f(DF2)'を使用できます。 Djangoの作者がformfield_callbackを属性として定義した理由は分かりません。 –