Python新手求教Node类修改Tree类属性的实现方法及对应设计模式
原代码问题说明
- 语法错误:
Node属于类定义,需要使用class关键字声明,你写的def Node()会被识别为普通函数,无法实例化使用 - 逻辑问题:
Node实例没有持有Tree实例的引用,无法直接访问并修改Tree实例的属性。
基础修复方案
你可以在实例化Node时将当前Tree实例的引用传递进去,即可实现属性修改,可运行代码如下:
class Node(): def __init__(self, tree_instance): # 存储传入的Tree实例引用 self.tree = tree_instance def callbacks(self): self.tree.a = 2 class Tree(): def __init__(self): self.a = 1 def printt(self): # 实例化Node时把当前Tree实例self作为参数传入 b = Node(tree_instance=self) b.callbacks() print(self.a) a = Tree() a.printt() # 运行输出结果为2
更优实现方案
推荐使用回调函数的方式降低两个类的耦合度,更符合Python的开发习惯:
class Node(): def __init__(self, callback=None): self.callback = callback def callbacks(self): if callable(self.callback): self.callback() class Tree(): def __init__(self): self.a = 1 def update_a(self): self.a = 2 def printt(self): # 直接把自身的更新方法作为回调传给Node b = Node(callback=self.update_a) b.callbacks() print(self.a)
这种实现不需要Node了解Tree的内部属性结构,后续如果要修改更新逻辑,只需要调整Tree的update_a方法即可,不需要改动Node的代码。
对应设计模式
这个场景对应的是观察者模式(发布-订阅模式的简化版本):Node作为事件发布方,Tree作为订阅方,将自身的响应逻辑注册到发布方,当发布方触发指定事件时自动执行注册的响应逻辑。这种模式非常适合跨组件解耦的场景,后续如果需要新增多个响应逻辑,只需要往Node的回调列表里新增注册项即可,不需要修改原有代码。
内容的提问来源于stack exchange,提问作者SamThYO
相关产品推荐
相关产品推荐

