2017-02-21 22 views
-1

Извините, что я новичок в oop.Почему 'AttributeError', когда я уже наследую базовый класс?

class A(object): 
    def __init__(self, idn, name): 
     self.idn = idn 
     self.name = name 


class B(object): 
    def __init__(self, idn, acc_no, criminal_case='No'): 
     self.idn = idn 
     self.acc_no = acc_no 
     self.criminal_case = criminal_case 

    def get_info(self): 
     return self.idn 

class C(A, B): 
    pass 


c = C(1, 'xyz') 
print c.get_info() 
print c.criminal_case 

Traceback (самый последний вызов последнего):

Файл "tp.py", строка 25, в

печати c.criminal_case

AttributeError: объект 'C' не имеет attribute 'criminal_case'

+0

Вам нужно будет позвонить 'super'. Но ваша структура наследования не имеет большого смысла. Где вы ожидаете, что 'B .__ init__' получит свои аргументы? Вы только передаете два на 'C'. Второй ли он должен быть 'name' или' acc_no'? – BrenBarn

+0

хорошо! но как я могу вызвать инициализацию B в C ?? –

ответ

1

Практически невозможно использовать множественное наследство без super(), так что вам нужно использовать super().

супер()

Return a proxy object that delegates method calls to a parent or sibling class of type. This is useful for accessing inherited methods that have been overridden in a class.

Ваш код должен выглядеть так:

class A(object): 
     def __init__(self, idn, name): 
      super(A, self).__init__(idn, name,'test') 
      self.idn = idn 
      self.name = name 

И вы получите результат:

1 
test 

В Python 3.x вы может просто использовать super().__init__(), и кажется, что вы используете Python 2.x, поэтому вам нужно использовать super(A, self).__init__(idn, name).

Надеюсь, это поможет.

+0

Спасибо, но как я могу получить доступ к атрибуту B 'criminal_case' ?? –

+0

@AmitKarnik 'super (A, self) .__ init __ (idn, name, 'this criminal_case')', вы получите результат. – McGrady

+0

Спасибо @McGrady –

1

Python не вызывает __init__() для каждого класса в иерархии наследования. Вместо этого он просто ищет иерархию для сначала__init__() и запускает его. Добавьте некоторые инструкции печати в код, чтобы убедиться в этом сами.

Чтобы вызвать B.__init__ от A, вам необходимо позвонить по телефону super(), следуя этим строкам.

super(A, self).__init__(idn, None) 

Но это не делает много смысла: где значение для acc_no предполагается взялось? Возможно, вам стоит пересмотреть дизайн вашего класса.