5

super実際には、「親クラス」を見つけてそのオブジェクトを返すために使用されることがわかっています。self.__class__.__mro__

私が混乱したのは、正確にいつ使用するかです。

以下のようなサンプルモデルコードがあるとします

version_1

class Example(models.Model):
    name = models.CharField()
    age  = models.IntegerField()

    def save(self, **args, **kwargs):
        obj = super(Example, self).save(self, **args, **kwargs)
        obj.name = "name changed"
        obj.age = "age changed"
        return obj

version_2

class Example(models.Model):
    name = models.CharField()
    age  = models.IntegerField()

    def save(self, **args, **kwargs):
        self.name = "name changed"
        self.age = "age changed"
        obj = super(Example, self).save(self, **args, **kwargs)
        return obj

上で観察できるように

version_1では、最初に呼び出しsuperてフィールドを変更し、obj を返しました

version_2では、フィールドを変更した後、super を呼び出して obj を返しました

では、フィールドの変更の前後に super が呼び出されるとどうなるでしょうか?

最後に知りたい/確認したいことは

  • djangoフォーム/モデルで正確にsuperが使用される場所/理由。
  • django / pythonでそれらを使用する正確な概念は何ですか(私がこれを間違って理解した場合)。
4

3 に答える 3

3

あなたが呼び出すsuper

  • 最初に、親のメソッドが処理に必要な属性を満たしている場合
  • 一部の属性の値を変更し、それらの新しい値で親のメソッド処理を適用したい場合は最後に

結論として、親メソッドの実装を変更したい場合:

  • 親のメソッドの実装に移動します。何が行われたかを確認します。IDE はおそらく親実装を取得する作業を容易にします。それ以外の場合は、Django インストール ディレクトリに移動してから、/lib/python/site-packages/django自分で実装を見つけます。
  • 必要に応じて (= 親メソッドによって生成された属性を使用するか、親メソッドによって使用される属性の値を変更します)、カスタム コードの前または後に super を使用します。
于 2013-10-05T12:42:10.277 に答える