【问题标题】:How to access attributes and methods of a component directly?如何直接访问组件的属性和方法?
【发布时间】:2021-08-20 19:23:00
【问题描述】:

在python中创建了一个复合类后,有没有一种(简单的)方法可以直接访问组件的属性/方法?那就是没有指定属性/方法属于哪个组件?

这是 MWE:

class Component1:
    def __init__(self, data1):
        self.data1 = data1

    def add1(self):
        return self.data1 + 1

class Component2:
    def __init__(self, data2):
        self.data2 = data2

    def add2(self):
        return self.data2 + 2



class Composite:
    def __init__(self, data1, data2):
        self.component1 = Component1(data1)
        self.component2 = Component2(data2)


composite = Composite(data1, data2)

# Now I can access data1 (and data2)
# But it is really cumbersome
composite.component1.data1



# So I would like to have just
composite.data1

有没有办法实现这一点,特别是当属性和方法的数量很多时?我知道我可以添加属性

@property
def data1(self):
    return self.component1.data1

但是对于大量的属性和方法来说这会很痛苦。

编辑:

每个组件都有不同的属性/方法名称。也没有共同的基础(例如,Component1().comp1_attibute_i 或类似的东西)。名称末尾的数字在真正的问题中不存在(它只是为了简化)。

【问题讨论】:

  • 您至少需要一种方法来映射出component1 具有属性data1。如果所有子字段都具有相同的名称,您可以迭代Composite 的所有属性,然后访问它们的公共属性。但是,如果没有通用名称,我看不出如何在不假设第一个找到的属性是您所追求的属性的情况下自动执行此操作。除非您假设任何以1 结尾的属性都有一个以1 结尾的子属性,但我认为这将是一个脆弱的命名方案。
  • @Carcigenicate:我已经编辑了问题以澄清命名约定。如果我理解正确,没有提供地图就没有办法“扁平化”层次结构?你能指点我一个方向,这张地图会是什么样子吗?非常感谢您的快速回答!感谢您的快速答复。
  • 如果您发现自己需要更频繁地访问组件而不是组合,那么首先您是否需要组合就会产生疑问。
  • @user64150 您可以尝试使用Composite__dict__ 属性。您可以对每个对象的 __dict__ 进行递归展平,以获得所有属性的平面字典。不过,这让我觉得有点老套和昂贵。我不知道有一种干净、廉价的方法可以实现您的目标。
  • @chepner:第一个组件定义优化问题,第二个解决优化问题,第三个根据优化结果计算输出(想想运行 OLS 后的 R2)。我认为将它包装到一个类中以将它们放在一起是有意义的,因为它属于一起。但如果更有意义的话,我很乐意使用不同的结构

标签: python oop methods attributes composition


【解决方案1】:

为您的班级派生或使用词典。一本字典有属性,一本字典有方法。

所以属性访问是composite["data1"]

函数可以通过getattr 调用。我不知道细节,但有一些有用的东西here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 2021-09-09
    • 1970-01-01
    相关资源
    最近更新 更多