2016-03-11 5 views
0

Я хотел бы наследовать все __init__ экземпляра класса. Например, если у вас есть объектив класса и объектив «L50mm». Я хотел бы, что моя камера с «L50mm» наследует все __init__ линзы, как это:Как наследовать _init_ из экземпляра класса?

class Lens: 
    def __init__(self,focallength,aperture): 
     self.focallength=focallength 
     self.aperture=aperture 

L50mm=Lens(50,2.2) 

class Camera: 
    def __init__(self,name,sensor,lens='None'): 
     self.name=name 
     self.sensor=sensor 
     if lens!='None':#if I have a lens mounted I want that all the __init__ is inherited e.g.: 
      super(Lens).__init__()#something like this I KNOW it doesn't work 
     else:#if I don't have a lens just keep 'None' 
      self.lens=lens 

mycamera=Camera('DSCF828','CCD',L50mm) 
>>TypeError: must be type, not classobj 

Конечно, я знаю, что я могу поставить self.lens=lens в методе камеры __init__ но мне было интересно, если есть более прямой способ наследования всех свойств.

Основная цель состоит в том, чтобы получить доступ непосредственно все методы:

mycamera.focallength 
mycamera.aperture 

вместо:

mycamera.lens.aperture 
mycamera.lens.focallength 

Вместо self.lens = Lens() как предложено в комментариях не имеет никакого смысла для меня обусловленно я бы должны снова передать все параметры, поэтому, пожалуйста, внимательно прочитайте вопрос.

+3

вы не используете с помощью 'super' правильный путь.' super' используется для вызова метода суперкласса. Может быть, здесь вы просто хотите создать новый экземпляр объектива, если он «Нет»? В этом случае вы просто хотите заменить «super (Lens) .__ init __()» на 'self.lens = Lens()' – loutre

+1

Что вы d что камера имеет не только объектив, но и камеру ** - объектив **, теперь это не имеет никакого смысла. –

+0

@AnttiHaapala, когда я рассматриваю свой объект в целом, это всего лишь exaple .... –

ответ

3

Я интересно, действительно ли вы действительно хотите наследовать наследование, по крайней мере, не в традиционном объектно-ориентированном смысле. Просто потому, что камера не является объективом, поэтому между ними нет правильного отношения супер/подтип.

Возможно, вы захотите обернуть атрибуты lens в Camera. Я не говорю, что это хорошая идея, но это возможно. Что вы можете сделать, это переопределить __getattr__:

class Camera(object): 
     def __getattr__(self, key): 
      return getattr(self.lens, key) 

     def __init__(self,name,sensor,lens=None): 
      self.name=name 
      self.sensor = sensor 
      self.lens = lens 

это означает, что если у вас есть объект камеры cam и пытается получить доступ к члену его, если это не в обычном порядке, он пытается использовать getattr(self.lens, key) вместо этого. Например cam.focallength терпит неудачу в традиционном смысле (так как нет в камере нет focallength, но вместо этого он будет идти на попытки эффективно перевести это в cam.lens.focallength вместо.

+0

Будет ли это работать? Разве вы не используете блок try-except и только пытаетесь getattr на объективе, когда первоначальный вызывает AttribueError? –

+1

@ HåkenLid Надеюсь, что так - метод '__getattr__' не вызывается, если поиск атрибутов в обычных местах не удался. – skyking

0

Мое мнение таково, что вы не используете POO в правильном направлении. Если вы действительно хотите сделать это, попробовать что-то вроде:

for attr in dir(lens): 
    setattr(self, attr, getattr(attr, lens)) 

например:

class Lens: 
    def __init__(self, a, b): 
     self.a, self.b = a, b 

class Camera: 
    def __init__(self, lens): 
     for attr in dir(lens): 
      setattr(self, attr, getattr(attr, lens)) 

lens = Lens(12, 13) 
cam = Camera(lens) 
cam.a 

Читать комментарии Ответ на этот вопрос, вы поймете, как грязный это :)

+0

Предупреждение:' dir() 'возвращает много специальных имен, включая' __class__'! –

+0

Возможно, вы должны что-то сделать, чтобы избежать изменения атрибутов на «Камера», которые уже имеют значение. –

+0

@loutre это не работает, можете ли вы привести пример? –

0

Это может быть сделана с использованием композиции вместо наследования. Это предполагает, что вы знаете, какие свойства нужно от объектива.

class Camera: 
    def __init__(self,name,sensor,lens=None): 
     self.name=name 
     self.sensor=sensor 
     if lens is not None: 
      self.focallength = lens.focallength 
      self.aperture = lens.aperture 

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

  • Нет связанных вопросов^_^