如何在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
相关产品推荐
相关产品推荐

