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

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_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:47:06