2016-12-24 10 views
1

Я проверял наследование питона, у меня есть это:Почему мой подкласс python не распознает атрибут из суперкласса?

__metaclass__=type 
class b: 
    def __init__(s): 
     s.hungry=True 
    def eat(s): 
     if(s.hungry): 
      print "I'm hungry" 
     else: 
      print "I'm not hungry" 
class d(b): 
    def __init__(s): 
     super(b,s).__init__() 
    def __mysec__(s): 
     print "secret!" 

obj=d() 
obj.eat() 

Там же ошибка времени выполнения, как:

Traceback (most recent call last): 
    File "2.py", line 17, in ? 
    obj.eat() 
    File "2.py", line 6, in eat 
    if(s.hungry): 
AttributeError: 'd' object has no attribute 'hungry' 

Я не мог этого понять, как супер класс «б» имеет s.hungry в своем init, а подкласс класса «супер» внутри своего собственного «init« Почему все-таки python говорит, что объект «d» не имеет атрибута «голодный»?

Другая путаница: сообщение об ошибке относится к «d» как к объекту, но я определил его как класс! Я получил что-то не так, как заставить его работать?

+1

Используйте 'super' на текущий класс, а не родительский класс. то есть 'super (d, s) .__ init __()' – mVChr

+0

Кроме того, я настоятельно рекомендую не использовать однобуквенные имена в Python. Я предлагаю прочитать https://www.python.org/dev/peps/pep-0008/ – mVChr

+0

super() в python3 очень просто, вам не нужны pass args. –

ответ

2
class d(b): 
    def __init__(s): 
     super(d,s).__init__() 
    def __mysec__(s): 
     print ("secret!") 

Document:

Для обоих случаев использования, типичный суперкласса вызов выглядит следующим образом:

> class C(B): 
>  def method(self, arg): 
>   super(C, self).method(arg) 
1

Я думаю, это то, что вы искали:

__metaclass__=type 
class b: 
    def __init__(self): 
     self.hungry=True 
    def eat(self): 
     if(self.hungry): 
      print "I'm hungry" 
     else: 
      print "I'm not hungry" 
class d(b): 
    def __init__(self): 
     super(d,self).__init__() 
    def __mysec__(self): 
     print "secret!" 

obj=d() 
obj.eat()