如何从类的实例继承_init_?

时间:2016-03-11 09:59:44

标签: python inheritance super

我想继承一个类实例的所有__init__。例如,如果一个镜头和镜头“L50mm”的实例。我想我的带有“L50mm”的相机继承了镜头的所有__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放在Camera __init__方法中,但我想知道是否有更直接的方式来继承所有属性。

主要目标是直接访问所有方法:

mycamera.focallength
mycamera.aperture

而不是:

mycamera.lens.aperture
mycamera.lens.focallength

而评论中建议的self.lens = Lens()对我来说没有任何意义,因为我必须再次传递所有参数,所以请仔细阅读问题。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我的意见是你没有以正确的方式使用POO。如果确实想要这样做,请尝试以下方法:

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

e.g:

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

阅读答案的评论,你就会明白它有多脏:)

答案 2 :(得分:0)

这可以使用合成而不是继承来完成。 这假设您从Lens知道需要哪些属性。

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