【发布时间】:2019-02-10 20:00:32
【问题描述】:
我想知道这是否可行,如果可以,在实现组合时如何访问“超级”类实例的属性。
下面提供的示例仅在此处提供想法并在进一步解释时建立共同点。
我想直接从对象“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
def get_id(cls):
return Car.id
但是这个解决方案的问题是,我可以为 Car 类(MiniVan、Truck 等)创建许多子类,并且我希望它仍然可以工作。
- 尝试使用描述符
def __get__(self, instance, owner):
return instance.id
但我可能理解错了,实际上 getter(据我了解干净的代码)应该返回类的实例而不是任何属性。
其他信息
- 我将始终使用 CarElement(或子类)实例作为 Car(或子类)实例的属性 - 不同的用法将被视为使用错误
- Car 类可以有很多不同的子类,但总是在继承方式内( Car
【问题讨论】:
-
您显然已经为这个问题付出了很多努力,但我建议您解释您想要的输出是 first,并且只有 then向我们展示您尝试的解决方案。
-
@Aran-Fey 感谢您的反馈。我已经编辑了问题
-
我建议在创建汽车元素时添加一个通用的“所有者”或“父级”。这允许您拥有诸如车门把手之类的子组件。汽车将只是没有所有者的根本“对象”。任何基于类而不是实例的解决方案,恕我直言,关系最终会出现问题。
-
@JLPeyret 你能提供一个这样的例子吗?因为我不确定是否真的遵循你的想法
标签: python oop composition