Я хотел бы знать, возможно ли это, и если да, как получить доступ к атрибуту (ам) экземпляра "супер" класса, когда реализована композиция.
Пример, приведенный ниже, предназначен только для того, чтобы дать представление об этом и установить общие позиции на дальнейших объяснениях.
Я хочу иметь доступ к атрибуту «id» для экземпляра MiniVan непосредственно из объекта «door» (тип 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, например:
@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)) но без композиции </li>