2014-09-28 4 views
0

Как класс наследуется от другого класса? Я пытаюсь реализовать его на следующем примере:Как класс наследуется от другого класса?

class parents(object): 
     def __init__(self,dim_x, dim_y, nameprefix, sequence_number): 
      if not isinstance(dim_x, (int, float, long)): 
      raise TypeError("Dimension in x must be a number") 
      else: 
      self.sizex=str(int(dim_x)) 
      if not isinstance(dim_y, (int, float, long)): 
      raise TypeError("Dimension in y must be a number") 
      else: 
      self.sizey=str(int(dim_y)) 
      if not isinstance(nameprefix, string_types): 
       raise TypeError("The name prefix must be a string") 
      else: 
       self.prefix=nameprefix 
      if not isinstance(sequence_number, (int, float, long)): 
      raise TypeError("The sequence number must be given as a number") 
      else: 
      self.sqNr=str(int(sequence_number)) 

Я хочу, что класс child наследует prefix и sqNr из parents класса

class child(parents): 
     def __init__(self,image_path='/vol/'): 
     self.IMG_PATH=image_path 
     self.ref_image=self.prefix+'_R_'+self.sqNr 
     logger.debug('Reference image: %s', self.ref_image) 

и запустить его с помощью следующих строк, но Я получаю сообщение об ошибке:

>>> p=parents(300, 300, 'Test',0) 
>>> p.prefix 
'Test' 
>>> c=child(p) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 4, in __init__ 
AttributeError: 'child' object has no attribute 'prefix' 

Я не понимаю, что не так в моей реализации, любое предложение?

ответ

3

child необходимо принять все аргументы за parents и передать их. Обычно вы не передаете экземпляр суперкласса в подкласс; это Состав, а не Наследование.

class child(parents): 
    def __init__(self, dim_x, dim_y, nameprefix, 
       sequence_number, image_path='/vol/'): 
     super(child, self).__init__(dim_x, dim_y, nameprefix, 
            sequence_number) 
     self.IMG_PATH = image_path 
     ... 

Затем это называется:

c = child(300, 300, 'Test', 0) 

Вам не нужно, чтобы создать parents экземпляр, создайте child непосредственно.

Обратите внимание, что в отношении style guide имена классов должны быть действительно Parent и Child.

+0

а как насчет 'image_path'? Если я хочу изменить начальное значение? – Dalek

+0

@ Далек же, как и любой другой аргумент по умолчанию, тоже пропустите: 'c = child (..., 'alternative_path')'. – jonrsharpe

+3

+1 для композиции против наследования - важное различие. –

3

Вам необходимо называть класс суперкласса '__init__ в классе детей.

class child(parents): 
    def __init__(self,image_path='/vol/'): 
     super(child, self).__init__(...) # dim_x, dim_y, nameprefix, sequence_number 
     .... 

В Python 3.x, вы можете использовать super() вместо super(child, self).

+0

и как я могу назвать второй класс? – Dalek

+0

@ Далек, вы имеете в виду класс «child»? В '__init__'? – falsetru

+0

да! должен ли он выглядеть следующим образом: 'super (child, self) .__ init __ (self, dim_x, dim_y, nameprefix, sequence_number)'? – Dalek

Смежные вопросы