我想知道是否可能,如果是的话,如何在实现组合时访问“超级”类实例的属性.
下面提供的示例仅用于提供想法,并在进一步说明中设置共同点.
我希望直接从对象“门”(类型为DoorElement)访问MiniVan实例的“id”属性.
我的守则
class Car:
def __init__(self, _id):
self.id = _id
class CarElement:
def __init__(self, name):
self.name = name
def get_car_id(self):
# Body which will access value of attribute "id"
return car_id
class MiniVan(Car):
def __init__(self, _id):
super(MiniVan, self).__init__(_id)
self.door = DoorElement('door')
self.engine = EngineElement('engine')
class DoorElement(CarElement):
def __init__(self, name):
super(DoorElement, self).__init__(name)
class EngineElement(CarElement):
def __init__(self, name):
super(EngineElement, self).__init__(name)
def main():
mini_van = MiniVan(123)
id_from_door = mini_van.door.get_car_id()
id_from_engine = mini_van.engine.get_car_id()
print(id_from_door) # Expected output 123
print(id_from_engine) # Expected output 123
if __name__ == '__main__':
main()
预期:
>打印两次“123”
我尝试过的:
>在创建对象期间传递必需属性
我知道我可以通过传递“car_id”来定义init方法,但出于某些原因,我希望尽可能避免使用它.如果没有,我会适当地去做.
>设置class属性,然后在classmethod中从CarElement类中调用它,例如:
@classmethod
def get_id(cls):
return Car.id
但是这个解决方案的问题是,我可以为Car class(MiniVan,Truck等)提供许多子类,我希望它仍然有效.
>尝试使用描述符
def __get__(self, instance, owner):
return instance.id
但我可以理解它是错误的,实际上getter(据我所知,干净的代码)应该返回一个类的实例,而不是任何属性.
附加信息
>我将始终使用CarElement(或子类)实例作为Car(或子类)实例的实例属性 – 不同的用法将被视为use-error
>可以有很多不同的Car类子类,但总是在继承方式(Car< - RacingCar(Car)< - FormulaOneCar(RacingCar))但没有组成
解决方法:
为了使代码正常工作,您必须使用car_id初始化所有CarElement-s.目前,您获得的错误来自于方法范围内缺少这样的变量.我对变化的想法是这样的:
class CarElement:
def __init__(self, name, car_id):
self.name = name
self.car_id = car_id
def get_car_id(self):
# Body which will access value of attribute id
return self.car_id
我看不到任何其他神奇的方式.