Как получить доступ к атрибуту объекта из метода другого объекта, который является одним из атрибутов в Python? - PullRequest
0 голосов
/ 10 февраля 2019

Я хотел бы знать, возможно ли это, и если да, как получить доступ к атрибуту (ам) экземпляра "супер" класса, когда реализована композиция.


Пример, приведенный ниже, предназначен только для того, чтобы дать представление об этом и установить общие позиции на дальнейших объяснениях.

Я хочу иметь доступ к атрибуту «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 "

Что я пробовал:

  1. Передача обязательного атрибута при создании объекта

Я знаю, что мог бы просто определить метод 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>

1 Ответ

0 голосов
/ 10 февраля 2019

Чтобы ваш код работал, вы должны инициализировать все CarElement -s с car_id.В настоящее время вы получаете ошибку из-за отсутствия такой переменной в области действия метода.Моя идея изменения такова:

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

Я не вижу другого волшебного пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...