如何从另一个对象的方法(这是Python中的属性之一)访问对象的属性?

时间:2019-02-10 20:00:33

标签: python oop composition

我想知道是否可能,如果可以,在实现组合时如何访问“超级”类实例的属性。


下面提供的示例仅是在此处提供想法,并为进一步的说明建立共识。

我想直接从对象“门”(类型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”

我尝试过的事情:

  1. 在创建对象时传递必需的属性

我知道我可以通过传递“ car_id”来定义 init 方法,但是出于某些原因,我希望尽可能避免使用它。如果没有的话,我大概会去做。

  1. 设置类属性,然后从class方法中的CarElement类调用它,例如:
@classmethod
def get_id(cls):
    return Car.id

但是这种解决方案的问题是,我可以为Car类设置许多子类(MiniVan,Truck等),并且我希望它仍能正常工作。

  1. 尝试使用描述符
def __get__(self, instance, owner):
    return instance.id

但是我可以理解为错误,实际上getter(据我了解干净的代码)应该返回类的实例,而不是任何属性。


其他信息

  • 我将始终使用CarElement(或子类)实例作为Car(或子类)实例的实例的属性-不同的用法将被视为使用错误
  • Car类可以有很多不同的子类,但是总是在继承方式下(Car <-RacingCar(Car)<-FormulaOneCar(RacingCar)),但是没有组合

1 个答案:

答案 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

我看不到其他任何魔术方式。