Python 如何从类的实例继承_init uu?

Python 如何从类的实例继承_init uu?,python,inheritance,super,Python,Inheritance,Super,我想继承类实例的所有\uuuu init\uuu。例如,如果有一个类透镜和它的透镜“L50mm”实例。我希望我的“L50mm”相机继承镜头的所有\uuuu init\uuuu,如下所示: class Lens: def __init__(self,focallength,aperture): self.focallength=focallength self.aperture=aperture L50mm=Lens(50,2.2) class Camera:

我想继承类实例的所有
\uuuu init\uuu
。例如,如果有一个类透镜和它的透镜“L50mm”实例。我希望我的“L50mm”相机继承镜头的所有
\uuuu init\uuuu
,如下所示:

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
\uuuu init\uuuu
方法中,但我想知道是否有更直接的方法来继承所有属性

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

mycamera.focallength
mycamera.aperture
而不是:

mycamera.lens.aperture
mycamera.lens.focallength

相反,注释中建议的
self.lens=lens()
对我来说没有任何意义,因为我必须再次通过所有参数,因此请仔细阅读问题

我的意见是你没有正确使用粪便。如果您真的想这样做,请尝试以下方法:

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


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

我的意见是你没有正确使用粪便。如果您真的想这样做,请尝试以下方法:

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


阅读答案的注释,你会明白它有多脏:)

我想知道你是否真的想做继承,至少不是传统的面向对象的意义上的继承。因为相机不是镜头,所以它们之间没有适当的超级/子类型关系

您可能需要将
镜头
的属性包装在
相机
中。我并不是说这是个好主意,但这肯定是可能的。您可以做的是覆盖
\uuu getattr\uuu

 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

我想知道你是否真的想继承,至少不是传统的面向对象的意义上的继承。因为相机不是镜头,所以没有合适的超级镜头/它们之间的子类型关系

您可能希望将
镜头
的属性包装在
相机
中。我不是说这是一个好主意,但肯定是可能的。您可以做的是覆盖
\uu getattr\uuuu

 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

这可以通过合成而不是继承来完成。 这假设您知道需要从镜头中获得哪些属性

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

这可以使用组合而不是继承来完成。 这假设您知道需要从镜头中获得哪些属性

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

使用
super
的方法不正确。
super
用于调用超类的方法。在这里,如果镜头
None
,您可能只想创建一个新的镜头实例?在这种情况下,您只想替换
super(镜头)。\uu init\uuu()
通过
self.lens=lens()你所做的是,相机不仅有镜头,而且相机也是A镜头,现在它没有任何意义。“安蒂哈帕拉,当我把我的目标看作是一个整体时,这只是一个例外……”LouTrE,我已经写了,在我的问题的最后,我不想用CAMLA.LSENS.属性来访问这个RE属性。因为我写了这个问题…@loutre我不能这样做,因为我必须重新设置所有参数…你没有正确使用
super
super
用于调用超类的方法。也许在这里你只想创建一个lens的新实例,如果它是
None
?在这种情况下,你只是不想o用
self.Lens=Lens()替换
super(镜头)。\uuuu init\uuu()
你所做的是,相机不仅有镜头,而且相机也是A镜头,现在它没有任何意义。“安蒂哈帕拉,当我把我的目标看作是一个整体时,这只是一个例外……”LouTrE,我已经写了,在我的问题的最后,我不想用CAMLA.LSENS.属性来访问这个RE属性。因为我写了这个问题…@loutre我不能这样做,因为我必须重新放置所有参数…警告:
dir()
返回许多特殊名称,包括
\uu class\uu
!您可能应该采取措施避免更改
相机上已经有值的属性。警告:
dir()
返回许多特殊名称,包括
\uuuu class\uuuuuuuuuuuuu
!您可能应该做些什么来避免更改
相机上已经有值的属性。这会起作用吗?您不应该使用try-except块,并且只有在初始块引发attribeerror时才在镜头上尝试getattr吗?@HåkenLid我希望如此-
\uu获得除非在通常位置的属性查找失败,否则不会调用attr__
方法。这会起作用吗?难道不应该使用try-except块,并且在初始块引发attribeerror时仅在lens上尝试getattr吗?@HåkenLid我希望如此-除非在通常位置进行属性查找,否则不会调用
\uu getattr____
方法生病了。