Dart Flutter继承问题:子类同步父类只读属性的正确语法
解决方案
根据需求,我们可以通过Python的@property装饰器实现父类属性的只读暴露,子类继承后直接复用或映射该属性,确保值与父类同步且无法修改。以下是几种常见的正确实现方式:
1. 直接继承父类的只读属性
父类通过@property实现对内部保护属性_prop的只读访问,子类继承后自然拥有该属性,无需额外定义即可使用,且无法直接修改。
class ParentClass: def __init__(self): self._prop = "初始值" # 保护属性,按惯例仅内部/子类可访问 @property def prop(self): return self._prop # getter方法,对外暴露属性值 class ChildClass(ParentClass): # 子类直接继承父类的prop属性 def use_prop(self): print(f"使用父类属性值: {self.prop}") # 测试验证 parent = ParentClass() child = ChildClass() print(child.prop) # 输出: 初始值 parent._prop = "父类更新后的值" # 父类修改内部属性 print(child.prop) # 输出: 父类更新后的值,自动同步 # 子类尝试修改prop会触发错误 try: child.prop = "子类尝试赋值" except AttributeError as e: print(e) # 输出: can't set attribute
2. 子类定义专属只读属性映射父类_prop
如果子类需要使用自定义属性名(比如child_prop),但要求值始终与父类_prop一致,可在子类中定义只读@property,内部直接返回父类的_prop:
class ParentClass: def __init__(self): self._prop = "初始值" @property def prop(self): return self._prop class ChildClass(ParentClass): @property def child_prop(self): # 直接返回父类的保护属性,确保值完全同步 return self._prop # 测试验证 parent = ParentClass() child = ChildClass() print(child.child_prop) # 输出: 初始值 parent._prop = "父类更新值" print(child.child_prop) # 输出: 父类更新值 # 子类无法修改自定义属性 try: child.child_prop = "子类尝试修改" except AttributeError as e: print(e) # 输出: can't set attribute
3. 严格禁止子类访问父类内部属性(私有属性方式)
如果要彻底避免子类直接修改父类的_prop,可以将父类属性改为双下划线开头的私有属性,此时子类无法直接访问该属性,只能通过父类提供的@property接口获取值:
class ParentClass: def __init__(self): self.__prop = "初始值" # 私有属性,子类无法直接访问 @property def prop(self): return self.__prop class ChildClass(ParentClass): def use_prop(self): print(f"通过父类接口获取值: {self.prop}") # 测试验证 parent = ParentClass() child = ChildClass() print(child.prop) # 输出: 初始值 parent._ParentClass__prop = "私有属性更新" # 父类内部可修改 print(child.prop) # 输出: 私有属性更新 # 子类无法直接访问私有属性 try: print(child.__prop) except AttributeError as e: print(e) # 输出: 'ChildClass' object has no attribute '__prop'
内容的提问来源于stack exchange,提问作者May
相关产品推荐
相关产品推荐

