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

标签 python oop composition

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


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

我想直接从对象“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. 设置类属性,然后在类方法中从 CarElement 类调用它,例如:
@classmethod
def get_id(cls):
    return Car.id

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

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

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


附加信息

  • 我将始终使用 CarElement(或子类)实例作为 Car(或子类)实例的属性——不同的用法将被视为使用错误
  • 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

我看不到任何其他神奇的方法。

关于python - 如何从另一个对象的方法访问对象的属性,这是 Python 中的属性之一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54620440/

相关文章:

python - 如何为文本解析器编写单元测试?

python - databricks 之外是否有另一种/类似的 Spark.read.format.load 方法?

python - 如何在 Python 中创建矩阵或将二维数组转换为矩阵?

database - 实体名称与表名称

python - 如何创建一个返回类本身实例的静态类属性?

f# - 我缺少什么: is function composition with multiple arguments possible?

java - 有没有什么方法可以设计我的 Java 代码,使这两个对象不引用自身?

python - 用元组跳过列填充 numpy.array

java - 组合语法对 Java 有用吗?

php - 是否应该使用反射或实例化来判断一个类是否存在并实现了一个接口(interface)?