Python中被外层类调用的类如何免传参访问外层类初始化变量
实现方案
有两种常用的实现方式可以达到你要的效果:
- 方案1:实例化Node时传入Master自身引用
这是最直观的实现,只需要让Node保存Master的实例,就能直接访问Master的所有属性:
class Node(): def __init__(self, master, arg1=0): self._a = None self._b = None self._c = False self._arg1_node = arg1 # 存储Master实例引用 self.master = master def method1(self): # 直接通过master引用访问对应属性 print(self.master._arg1, self.master._arg2, self.master._arg3) class Master: def __init__(self, arg1=3, arg2=20, arg3=1): self._arg1 = arg1 self._arg2 = arg2 self._arg3 = arg3 def method1(self): # 实例化Node时传入当前Master实例的self self._root = Node(self) self._root.method1() Master().method1()
该方案的优势是后续Master新增属性时,Node无需调整传参逻辑即可直接访问,适配性强,适合大多数从属关系的类设计场景。
- 方案2:批量注入需要的属性到Node实例
如果不想让Node拿到Master的全部访问权限,可以只把需要的属性批量赋值给Node实例:
class Node(): def __init__(self, arg1=0): self._a = None self._b = None self._c = False self._arg1_node = arg1 def method1(self): print(self._arg1, self._arg2, self._arg3) class Master: def __init__(self, arg1=3, arg2=20, arg3=1): self._arg1 = arg1 self._arg2 = arg2 self._arg3 = arg3 def method1(self): self._root = Node() # 筛选需要的属性批量注入到Node实例 self._root.__dict__.update({ k:v for k,v in self.__dict__.items() if k in ("_arg1", "_arg2", "_arg3") }) self._root.method1() Master().method1()
该方案的优势是两个类的耦合度更低,Node仅能拿到你允许传递的属性,权限更可控。
内容的提问来源于stack exchange,提问作者solid
相关产品推荐
相关产品推荐

