2016-10-28 3 views
-1

У меня есть определение структуры класса следующим образом: Что я не понимаю, как 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 

Может кто-нибудь объяснить мне, сколько строк кода на самом деле есть в методе обновления класса Avg и как супер() работает здесь?

+0

'супер()' предоставляет доступ к существующим методам другого класса в классе MRO; это означает, что вы просто * вызываете другой метод *, только одно может иметь то же имя, что и тот, который уже присутствует в экземпляре. –

+0

super * звонки * способ из базового класса. Что касается количества строк кода, вы можете их подсчитать. –

+0

@ DanielRoseman, говорящий «базовый класс», вводит в заблуждение. Он не всегда вызывает базовый класс, он может вызывать класс сестры. – wim

ответ

1

Супер() буквально является вызовом метода из суперкласса. В вашем примере вызов метода обновления из класса Avg сначала будет выполнять точно метод обновления из класса Std с параметрами vect и label, которые вы передали в этой строке super(Avg, self).update(vect, label). Затем он будет запускать остальную часть кода, который вы написали после супервызов.

Ваш метод обновления Avg эквивалентно

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 
Смежные вопросы