我想知道是否可能,如果可以,在实现组合时如何访问“超级”类实例的属性。
下面提供的示例仅是在此处提供想法,并为进一步的说明建立共识。
我想直接从对象“门”(类型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()
预期:
我尝试过的事情:
我知道我可以通过传递“ car_id”来定义 init 方法,但是出于某些原因,我希望尽可能避免使用它。如果没有的话,我大概会去做。
@classmethod
def get_id(cls):
return Car.id
但是这种解决方案的问题是,我可以为Car类设置许多子类(MiniVan,Truck等),并且我希望它仍能正常工作。
def __get__(self, instance, owner):
return instance.id
但是我可以理解为错误,实际上getter(据我了解干净的代码)应该返回类的实例,而不是任何属性。
其他信息
答案 0 :(得分:0)
为了使代码正常工作,您必须使用CarElement
初始化所有car_id
-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
我看不到其他任何魔术方式。