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

问题描述 投票:4回答:1

我想知道,如果有可能,如果是,如何访问一个“超级”类的实例,其组成实现时的属性(一个或多个)。


下面提供的例子只是提供关于进一步的解释这里的想法和设置共同点。

我想有直接对象“门”获得“id”属性为小型货车的一个实例(类型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”但由于某些原因,我喜欢尽可能地避免它。如果没有,我会propably只是去了。

  1. 设置类属性,然后内类方法e.g从CarElement类调用它:
@classmethod
def get_id(cls):
    return Car.id

但是,这种解决方案的问题是,我可以有很多儿童类汽车类(小型货车,卡车等),我想有它仍在工作。

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

但我能理解错了,实际上吸气剂(据我了解干净的代码)应该返回一个类,而不是任何属性的实例。


附加信息

  • 我会一直使用CarElement(或子类)实例作为汽车(或子类)实例的实例的属性 - 不同的使用将被视为使用错误
  • 可以有很多汽车类的不同的子类,但总是在继承方式(汽车< - 赛车(汽车)< - FormulaOne车(赛车)),但没有成分
python oop composition
1个回答
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

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

© www.soinside.com 2019 - 2024. All rights reserved.