我想知道当使用组合时,是否可以访问“超级”类实例的属性,如果可以,应该如何访问。
下面提供的示例仅用于提供思路,并在进一步说明上建立共同基础。
我希望直接从对象“door”(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 方法,但出于某些原因,如果可能的话,我希望避免这样做。如果不行,我可能会选择这样做。
- 设置类属性,然后从 CarElement 类内的 classmethod 调用它,例如:
@classmethod
def get_id(cls):
return Car.id
但是这种解决方案的问题在于,我可以为Car类创建许多子类(MiniVan、Truck等),而我仍希望它能正常工作。
- 尝试使用描述符
def __get__(self, instance, owner):
return instance.id
但我可能理解有误,根据我对清晰代码的理解,getter应该返回类的实例而不是任何属性。
附加信息
- 我始终会将CarElement(或子类)的实例用作Car(或子类)的实例的属性 - 不同的用法将被视为使用错误
- 可以有许多不同的Car类的子类,但始终采用继承方式(Car <- RacingCar(Car) <- FormulaOneCar(RacingCar)),而不使用组合方式