如何让MainClass直接获取内部子类Class2的实例变量?
解决方案
方法一:让MainClass直接继承Class2
这是最贴合面向对象设计规范的写法,和Class2继承Class1的逻辑完全一致——通过super().__init__()触发父类的初始化逻辑,把Class2(包括它继承自Class1)的所有实例变量都纳入MainClass的实例中,之后就能直接用self.xxx访问这些变量。
示例代码:
class Class1: def __init__(self): self.a = "Class1的实例变量" class Class2(Class1): def __init__(self): super().__init__() self.b = "Class2的实例变量" # 让MainClass继承Class2 class MainClass(Class2): def __init__(self): super().__init__() # 初始化Class2及父类Class1的所有实例变量 self.c = "MainClass自身的变量" # 测试 mc = MainClass() print(mc.a) # 直接访问Class1的变量 print(mc.b) # 直接访问Class2的变量 print(mc.c) # 访问自身变量
方法二:组合模式+属性代理(不适合继承的场景)
如果因为架构设计限制,不能让MainClass继承Class2,可以用__getattr__方法实现自动属性转发——当访问MainClass实例上不存在的属性时,自动从内部持有的Class2实例中获取对应属性。
示例代码:
class Class1: def __init__(self): self.a = "Class1的实例变量" class Class2(Class1): def __init__(self): super().__init__() self.b = "Class2的实例变量" class MainClass: def __init__(self): self._class2_instance = Class2() # 内部持有Class2实例 self.c = "MainClass自身的变量" def __getattr__(self, attr_name): # 自身没有该属性时,自动从_class2_instance中获取 return getattr(self._class2_instance, attr_name) # 测试 mc = MainClass() print(mc.a) # 自动转发到_class2_instance.a print(mc.b) # 自动转发到_class2_instance.b print(mc.c) # 访问自身变量
为什么不推荐你之前的两种方法
- 间接访问
self.values.a:写法繁琐,违背了直接访问属性的简洁性需求; - 直接更新
__dict__:如果Class2有动态生成的属性、@property装饰的属性,这种方式无法正确获取;还可能意外覆盖MainClass自身的属性,存在安全隐患。
内容的提问来源于stack exchange,提问作者Vinicius Nogueira
相关产品推荐
相关产品推荐

