Python 3.8+子类化set:如何让运算符返回子类类型且无需重定义所有运算符
子类化set时让二元运算符返回子类类型(Python3.8+)
默认情况下,Python中set的二元运算符(如&、|、-、^)返回的是set类实例,而非子类实例。要实现运算符返回子类类型,无需逐个重定义所有运算符,只需重写set内部用于生成实例的_from_iterable类方法即可。
解决方案代码
class A(set): @classmethod def _from_iterable(cls, it): return cls(it) # 验证效果 a = A([1,2,3]) & A([1,2,4]) print(a.__class__ == A) # 输出: True # 其他运算符同样生效 b = A([1,2,3]) | A([4,5]) print(b.__class__ == A) # 输出: True c = A([1,2,3]) - A([2]) print(c.__class__ == A) # 输出: True
原理说明
set的所有非原地二元运算(即不修改原对象的运算)内部都会调用_from_iterable方法,从运算结果的可迭代对象创建新实例。重写这个方法后,会直接返回当前子类A的实例,而非父类set的实例,从而让所有依赖该方法的运算符都自动返回子类类型。
这个方案适用于Python3.8及以上版本,无需重定义每个运算符,代码简洁且覆盖所有相关运算场景。
内容的提问来源于stack exchange,提问作者hl037_
相关产品推荐
相关产品推荐

