【发布时间】: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