Я хотел бы знать, возможно ли это, и если да, то как получить доступ к атрибутам экземпляра "супер" класса при реализации композиции.
Пример, представленный ниже, предназначен только для того, чтобы дать представление и установить общую основу для дальнейших объяснений.
Я хочу иметь доступ к атрибуту «id» для экземпляра MiniVan непосредственно из объекта «дверь» (типа DoorElement).
Мой код
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"
Что я пробовал:
- Передача обязательного атрибута при создании объекта
Я знаю, что мог бы просто определить метод init с передачей "car_id", но по некоторым причинам я хотел бы избежать этого, если это возможно. Если нет, я бы, наверное, просто пошел на это.
- установить атрибут класса, а затем вызвать его из класса CarElement внутри метода класса, например:
@classmethod
def get_id(cls):
return Car.id
Но проблема с этим решением заключается в том, что у меня может быть много дочерних классов для класса автомобилей (MiniVan, Truck и т. д.), и я хочу, чтобы он все еще работал.
- Попытка использовать дескриптор
def __get__(self, instance, owner):
return instance.id
Но я мог понять это неправильно, и на самом деле геттер (насколько я понимаю чистый код) должен возвращать экземпляр класса, а не какой-либо атрибут.
Дополнительная информация
- Я ВСЕГДА буду использовать экземпляры CarElement (или дочерних классов) в качестве атрибутов экземпляров экземпляров Car (или дочерних классов) - другое использование будет рассматриваться как ошибка использования
- Может быть много разных дочерних классов класса Car, но всегда в рамках наследования ( Car ‹- RacingCar(Car) ‹- FormulaOneCar(RacingCar) ), но без композиции