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

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

下面提供的示例仅用于提供想法,并在进一步说明中设置共同点.

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

我尝试过的:

>在创建对象期间传递必需属性

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

>设置class属性,然后在classmethod中从CarElement类中调用它,例如:

@classmethod
def get_id(cls):
    return Car.id

但是这个解决方案的问题是,我可以为Car class(MiniVan,Truck等)提供许多子类,我希望它仍然有效.

>尝试使用描述符

def __get__(self, instance, owner):
    return instance.id

但我可以理解它是错误的,实际上getter(据我所知,干净的代码)应该返回一个类的实例,而不是任何属性.

附加信息

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

解决方法:

为了使代码正常工作,您必须使用car_id初始化所有CarElement-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

我看不到任何其他神奇的方式.

上一篇:有没有办法在PHP中实现多重继承?


下一篇:c# – 依赖注入和第三方API – 带PI或Wrapper的扩展方法