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

2024-09-28 22:37:17 发布

您现在位置:Python中文网/ 问答频道 /正文

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


下面提供的例子只是为了在这里提供想法,并为进一步的解释建立共同的基础。在

我想直接从对象“door”(类型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属性,然后从classmethod中的CareElement类调用它,例如:
^{pr2}$

但这个解决方案的问题是,我可以有许多汽车类的子类(微型货车、卡车等),我希望它仍然有效。在

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

但我可能理解错误,实际上getter(就我所理解的干净代码而言)应该返回类的实例,而不是任何属性。在


其他信息

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

Tags: 实例nameselfid属性initdefcar
1条回答
网友
1楼 · 发布于 2024-09-28 22:37:17

为了让代码正常工作,您必须用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

我看不出其他什么神奇的方法了。在

相关问题 更多 >