You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中确保两个属性始终被一同重写?

实现子类重写属性的成对约束

可以通过Python的__init_subclass__方法实现这个约束,它会在子类被定义时自动执行,我们可以在这里检查子类是否只重写了prop1或prop2中的一个。

修改后的父类代码如下:

import abc

class Parent(abc.ABC):
    def __init__(self):
        pass

    @property
    def prop1(self):
       return None
    
    @property
    def prop2(self):
       return None

    @classmethod
    def __init_subclass__(cls):
        # 检查子类自身是否重写了这两个属性
        has_prop1 = 'prop1' in cls.__dict__
        has_prop2 = 'prop2' in cls.__dict__
        
        # 若只重写了其中一个,抛出错误
        if has_prop1 != has_prop2:
            raise TypeError(f"子类 {cls.__name__} 必须同时重写prop1和prop2,或者都不重写")

验证示例

  • 合法子类(都不重写):
class ValidChild1(Parent):
    pass
  • 合法子类(都重写):
class ValidChild2(Parent):
    @property
    def prop1(self):
        return "value1"
    
    @property
    def prop2(self):
        return "value2"
  • 非法子类(只重写一个):
class InvalidChild(Parent):
    @property
    def prop1(self):
        return "only prop1"

定义这个子类时会直接抛出TypeError: 子类 InvalidChild 必须同时重写prop1和prop2,或者都不重写

原理说明

cls.__dict__仅包含子类自身定义的属性和方法,不包含从父类继承的内容。通过判断prop1和prop2是否存在于子类的__dict__中,就能确定子类是否重写了这两个属性。如果两者的重写状态不一致(一个被重写、一个没有),就触发错误,强制约束子类必须成对重写或都不重写。

内容的提问来源于stack exchange,提问作者Priyatham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 09:57:03