0

データベース、特にデータベースを扱う Python ORM を扱っているときに、あることに気付きました。

save()django の関数の例を次に示します。

def save(self, **kwargs):
    self.somevar = dosomething(self.someothervar)
    return super(<Your_Model_Here>, self).save()

関数が使用されているGoogleアプリエンジンでもput()

def put(self, **kwargs):
    self.<some_var> = doSomething(self.someOtherVar)
    return super(<Entity>, self).save()

これで、IIRC がこれを行う理由がわかりました。or 関数を手動で記述していないため、これを行うため、put()適切save()に機能させるにはスーパー コールを使用する必要があります。

なぜ保存機能がこのようになっているのか、もっと詳しい説明を教えてください。入ってコーディングするだけで学んだので、それについての私の理解は間違っていますが、save()orput()関数を書くときに何が起こっているのかを(はっきりと)理解していません。

4

1 に答える 1

1

サブクラスでオーバーライドされているメソッドを目撃しているだけです。サブクラス化の目的は、必要に応じてコードを再利用し、機能をオーバーライドすることです。場合によっては、メソッドをオーバーライドし、その親の一部を呼び出す必要があります。

super親クラスのメソッドを呼び出します。

これは、サブクラス化をまったく行わないのとまったく同じです。

def save(...):
   return super(MyClass, self).save(...)

逆に、スーパー コールを使用せずにメソッドを記述した場合、親クラスのメソッド機能が完全に置き換えられます。

def save(...):
   print ("I have nothing to do with my parent class")

機能を補足したい場合 (つまり、古い動作を維持しつつ何か特別なものを追加する場合)、super を使用して、新しいメソッド内から元のメソッドを呼び出します。

def save(...):
   print ("I am called directly before the original parent method")
   return super(MyClass, self).save(...)
于 2013-06-21T16:58:25.147 に答える