2016-10-28 5 views
-1

私は次のようなクラス構造の定義を持っています: 私が理解できないのは、Super()はここで基本クラスの関数でSuperクラスのコードをどのように使用するのですか?super()はどのようにして子クラスの関数内で動作しますか?

class Std(object):  
    def __init__(self): 
     self.W = defaultdict(int) 

    def update(self, vect, label): 
     self.bias += label 
     for k, v in vect.items(): 
      self.W[k] += v * label 
class Avg(Std): 
    def __init__(self): 
     super(Avg, self).__init__() 
     self.U = defaultdict(int) 
     self.beta = 0 

    def update(self, vect, label): 
     super(Avg, self).update(vect, label) 
     self.beta += label * self.count 
     for k, v in vect.items(): 
      self.U[k] += v * label * self.count 

何行のコードスーパー()ここではどのように動作しない平均クラスのupdateメソッドで、実際にそこにいると、誰かが私に説明できますか?

+0

'超に相当します。つまり、単に別のメソッド*を呼び出すだけで、すでにインスタンスに存在するメソッドと同じ名前を持つことができます。 –

+0

スーパークラス*メソッドは基本クラスから呼び出します。コードの行数は数えます。 –

+0

@DanielRosemanが「基本クラス」と言っているのは誤解を招くことです。常に基本クラスを呼び出すとは限らず、兄弟クラスを呼び出すことができます。 – wim

答えて

1

super()は、文字通りスーパークラスからのメソッドへの呼び出しです。あなたの例では、Avgクラスからupdateメソッドを呼び出すと、最初に、この行に渡したvectとlabelのパラメータを持つStdクラスのupdateメソッドを正確に実行しますsuper(Avg, self).update(vect, label)。次に、スーパーコールの後に書いた残りのコードを実行します。

あなたの平均更新方法は、() `あなたはクラスのMROで別のクラスの既存のメソッドにアクセスすることができます

class Avg(Std): 
    def __init__(self): 
     super(Avg, self).__init__() 
     self.U = defaultdict(int) 
     self.beta = 0 

    def update(self, vect, label): 
     self.bias += label 
     for k, v in vect.items(): 
      self.W[k] += v * label 

     self.beta += label * self.count 
     for k, v in vect.items(): 
      self.U[k] += v * label * self.count 
関連する問題