如果我理解正确,聚合与组合是关于对象对其成员的责任(例如,如果您删除一个实例,您是否也删除了它的成员?)。
主要是,这在很大程度上取决于实施。例如,要创建一个接收类 B(聚合)实例的类 A,您可以编写以下代码:
class B(object): pass
class A(object):
def __init__(self, b):
self.b = b
b = B()
a = A(b)
但需要注意的是,Python 没有任何内置功能可以阻止您传入其他内容,例如:
a = A("string") # still valid
如果您想在 A(组合)的构造函数中创建 B 的实例,您可以编写以下内容:
class A(object):
def __init__(self):
self.b = B()
或者,您可以将类注入构造函数,然后创建一个实例,如下所示:
class A(object):
def __init__(self, B):
self.b = B()
顺便说一句,至少在您的第一个示例和可能的第二个示例中,您将 B 设置为 B 的类定义,而不是它的实例:
class A(object):
def __init__(self, B):
self.B = B
>>> a = A()
>>> a.B # class definition
<class __main__.B at 0x028586C0>
>>> a.B() # which you can make instances of
<__main__.B instance at 0x02860990>
所以,你最终得到了一个指向 B 的类定义的 A 实例,我很确定这不是你想要的。虽然,这通常用其他语言很难做到,所以我理解这是否是混淆点之一。