11

一般的に、私はメソッドをオーバーライドして super() を使用する Python の方法に慣れていません。

質問は: オーバーライドできますget_FOO_display()か?

class A(models.Model):
   unit = models.IntegerField(choices=something)

   def get_unit_display(self, value):
     ... use super(A, self).get_unit_display() 

ディスプレイを複数形にしたいので、 get_FOO_display() をオーバーライドしたいと思います。

しかし、うまくいきsuper(A, self).get_unit_display()ません。

4

4 に答える 4

10

通常、示したようにメソッドをオーバーライドするだけです。ただし、ここでの秘訣は、get_FOO_displayメソッドがスーパークラスに存在しないため、メソッドを呼び出してsuperも何も実行されないことです。メソッドは、メタクラスによってモデルに追加されるときに、フィールド クラスによって動的に追加されます。ソースはこちらを参照してください(編集:パーマリンクとしての古いリンク)。

できることの 1 つは、フィールドのカスタム Field サブクラスを定義し、必要なメソッドを構築するようunitにオーバーライドcontribute_to_classすることです。残念ながら少し難しいです。

(2 番目の質問がわかりません。正確には何を尋ねているのですか?)

于 2012-12-18T10:36:23.597 に答える
-3

サブクラスで同じ名前のメソッドを作成することにより、スーパークラスのメソッドをオーバーライドできるはずです。引数の署名は考慮されません。例えば:

class A(object):
    def method(self, arg1):
        print "Method A", arg1

class B(A):
    def method(self):
        print "Method B"

A().method(True) # "Method A True"
B().method() # "Method B"

get_unit_display() の場合、表示値を変更する場合は、super() を呼び出す必要はまったくありませんが、super() を使用する場合は、正しい署名で呼び出していることを確認してください。 、 例えば:

class A(models.Model):
    unit = models.IntegerField(choices=something)

    def get_unit_display(self, value):
        display = super(A, self).get_unit_display(value)
        if value > 1:
            display = display + "s"
        return display

super() の get_unit_display() に値を渡していることに注意してください。

于 2012-12-18T01:42:04.013 に答える