有没有一种简单的方法可以在不重新定义所有运算符的情况下子类化Python的集合?

问题描述 投票:0回答:1

有没有办法子类化

set
,让二元运算符返回子类类型,而不需要重新定义它们?

示例:

class A(set):
    pass

a = A([1,2,3]) & A([1,2,4])

a.__class__ == A # it's False, and I would like it to be true without redefining all operators
python subclassing
1个回答
0
投票

我相信答案是“否”。

当我浏览参考实现时,看起来二进制

AND
的所有路径似乎最终都会返回
NULL
或调用
make_new_set_basetype()
的结果。

该方法当前实现为:

make_new_set_basetype(PyTypeObject *type, PyObject *iterable)
{
    if (type != &PySet_Type && type != &PyFrozenSet_Type) {
        if (PyType_IsSubtype(type, &PySet_Type))
            type = &PySet_Type;
        else
            type = &PyFrozenSet_Type;
    }
    return make_new_set(type, iterable);
}

因此,如果不覆盖子类中的

__and__()
,您将返回的是
set()
frozenset()

© www.soinside.com 2019 - 2024. All rights reserved.