【问题标题】:How to access attribute of object from another object's method, which is one of attributes in Python?如何从另一个对象的方法访问对象的属性,这是 Python 中的属性之一?
【发布时间】:2019-02-10 20:00:32
【问题描述】:

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


下面提供的示例仅在此处提供想法并在进一步解释时建立共同点。

我想直接从对象“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

但是这个解决方案的问题是,我可以为 Car 类(MiniVan、Truck 等)创建许多子类,并且我希望它仍然可以工作。

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

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


其他信息

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

【问题讨论】:

  • 您显然已经为这个问题付出了很多努力,但我建议您解释您想要的输出是 first,并且只有 then向我们展示您尝试的解决方案。
  • @Aran-Fey 感谢您的反馈。我已经编辑了问题
  • 我建议在创建汽车元素时添加一个通用的“所有者”或“父级”。这允许您拥有诸如车门把手之类的子组件。汽车将只是没有所有者的根本“对象”。任何基于类而不是实例的解决方案,恕我直言,关系最终会出现问题。
  • @JLPeyret 你能提供一个这样的例子吗?因为我不确定是否真的遵循你的想法

标签: python oop composition


【解决方案1】:

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

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

【讨论】:

  • 与其存储汽车的ID,不如引用汽车对象可能更好。这样您就可以访问汽车的所有属性和方法。
  • 是的,我实际上已经看到这个输出完全没有意义。我知道,我可以通过将此值作为属性传递来初始化对象,但问题是是否有任何其他方式可以访问它
  • 如答案所述:否。您的尝试看起来像是在 Python 上强加 C++ 对象模型。它们是不同且不相容的。 Python 对象模型要简单得多。
  • @sophros 根据我使用库 page_objects 的经验,完全按照描述(应用程序中的视图用作从 PageObject 继承的类,并且元素定义为 PageElement 类的实例)我会说有可能有这样的访问权限。在附加链接中,我们在调用实例化视图的属性时直接在 PageElement 属性中访问作为 PageObject (self.w) 的属性传递的 SeleniumWebDriver。
猜你喜欢
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多