Python类组合场景下同父嵌套子对象互相访问成员的实现问题
问题原因
原代码无法运行是三个基础错误导致的:
- Python中类的实例方法(包括
__init__构造方法)必须把self作为第一个参数,原代码所有构造方法都漏写了该参数 - 类A的构造方法里实例化B、C时,只声明了局部变量,没有把实例绑定到A的实例属性上,初始化执行完后局部变量会被直接回收,外部无法访问
- C的实例中不存在
self.b属性,直接写self.b.attribute_1会触发属性不存在的运行时错误
平级组合对象互相访问的核心逻辑是:两个子对象本身没有关联,需要通过第三方(通常是持有它们的父对象)传递引用,才能拿到对方的实例访问成员。
实现方案
根据耦合度要求不同,有两种常用实现方式:
方案1:传递父实例引用(适合子对象需要访问多个父类成员/其他平级对象的场景)
实例化子对象时把父类实例自身作为参数传入,子对象保存父实例的引用,后续就可以通过这个引用访问同属一个父实例的所有其他子对象和父类自身的成员。
可运行代码示例:
class A(object): def __init__(self): # 把当前A的实例self作为参数传给子对象构造方法 self.B = B(self) self.C = C(self) class B(): def __init__(self, parent): # 保存父实例引用 self.parent = parent self.attribute_1 = "B实例的属性值" def get_info(self): return "B实例的方法返回值" class C(): def __init__(self, parent): self.parent = parent self.attribute_1 = "C实例的属性值" # 通过父实例引用拿到同属的B实例,访问属性和方法 self.b_attr = self.parent.B.attribute_1 self.b_method_result = self.parent.B.get_info() if __name__ == "__main__": parent_obj = A() print(parent_obj.C.b_attr) # 输出:B实例的属性值 print(parent_obj.C.b_method_result) # 输出:B实例的方法返回值
方案2:直接传递依赖对象(低耦合,适合子对象只需要访问特定平级对象的场景)
如果C只需要访问B的成员,不需要用到父类A的其他能力,就不用传递整个父实例,只需要在初始化C的时候把已经实例化好的B对象传进去即可,这种方式符合最小知道原则,代码可维护性更高。
可运行代码示例:
class A(object): def __init__(self): # 先实例化被依赖的B self.B = B() # 只把C需要的B实例作为参数传入 self.C = C(self.B) class B(): def __init__(self): self.attribute_1 = "B实例的属性值" def get_info(self): return "B实例的方法返回值" class C(): def __init__(self, b_instance): # 直接持有需要访问的B实例引用 self.b = b_instance self.attribute_1 = "C实例的属性值" self.b_attr = self.b.attribute_1 self.b_method_result = self.b.get_info() if __name__ == "__main__": parent_obj = A() print(parent_obj.C.b_attr) # 输出:B实例的属性值 print(parent_obj.C.b_method_result) # 输出:B实例的方法返回值
注意事项
不要在B和C之间互相直接持有强引用形成循环引用,容易引发不必要的内存泄漏,通过上述两种方式传递依赖即可满足绝大多数组合场景下的平级对象通信需求。
内容的提问来源于stack exchange,提问作者mikejacobspython
相关产品推荐
相关产品推荐

