如何从 class 的实例继承 _init_?
How to inherit _init_ from an instance of a class?
我想继承一个class实例的所有__init__
。例如,如果 a 有一个 class 镜头和一个镜头 "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()
对我来说没有任何意义,因为我必须再次传递所有参数,所以请仔细阅读问题。
我认为您没有正确使用 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
看了答案的评论,你就知道有多脏了:)
我想知道你是否真的想做继承,至少不是传统的面向对象意义上的继承。仅仅是因为相机不是镜头,所以它们之间没有适当的 super/sub 类型关系。
您可能想要将 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
。
这可以使用组合而不是继承来完成。
这假设您知道您需要 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
我想继承一个class实例的所有__init__
。例如,如果 a 有一个 class 镜头和一个镜头 "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()
对我来说没有任何意义,因为我必须再次传递所有参数,所以请仔细阅读问题。
我认为您没有正确使用 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
看了答案的评论,你就知道有多脏了:)
我想知道你是否真的想做继承,至少不是传统的面向对象意义上的继承。仅仅是因为相机不是镜头,所以它们之间没有适当的 super/sub 类型关系。
您可能想要将 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
。
这可以使用组合而不是继承来完成。 这假设您知道您需要 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