首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使Python ` when‘和` `frozenset`’子类在执行二进制操作时保留它们的类型?

如何使Python ` when‘和` `frozenset`’子类在执行二进制操作时保留它们的类型?
EN

Stack Overflow用户
提问于 2018-10-16 11:26:03
回答 1查看 405关注 0票数 1

我有一些setfrozenset子类,OCDSetOCDFrozenSet。当我在二进制操作中将它们与它们的祖先类的实例一起使用时,祖先类将主导结果的类型,我的意思是,当我从一个OCDFrozenSet中减去一个frozenset…时,就会得到一个frozenset…。但是,如果我反转操作中的类型(即从一个frozenset中减去一个OCDFrozenSet ),情况也是如此。

就像这样:

…尤其让我感到苦恼的是,使用-= (减法就地)会改变现有实例的类型!

我对如何处理这类事情的知识严格来自于C++,在这种情况下,操作的类型是在(可能是模板化的)操作符重载函数中明确指定的一个已放弃的结论;在Python系统中,通常要隐式得多,但它的不可预测性并不像我现在所相信的那样不可预测。

那么,解决这一问题的最有效的方法是什么--我认为它包括在感兴趣的子类中覆盖一些双重强调的实例方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-16 13:18:45

就地操作并不保证它们将更新就地对象,它完全取决于对象的类型。

元组、冻结集等是不可变的类型,因此不可能就地更新它们.

来自图书馆参考资料的本地操作符:

对于字符串、数字和元组等不可变目标,将计算更新后的值,但不将其分配给输入变量。

类似地,frozenset文档也提到了关于就地操作[来源]的相同内容:

下表列出了不适用于不可变的frozenset实例的set的可用操作。

现在,由于您的OCDFrozenSet没有实现__isub__,它将回到__sub__方法,该方法将返回基类frozenset的类型。之所以使用这个基类,是因为Python不知道基类在新创建的frozenset上所期望的来自__sub__操作的参数。

更重要的是,这是一个Python 2中的bug,其中这样的操作返回子类实例,修复只是移植到Python 3,尽管这样做是为了防止破坏现有的系统。

要获得预期的输出,可以在子类中提供所需的方法:

代码语言:javascript
复制
class OCDFrozenSet(frozenset):
    def __sub__(self, other):
        return type(self)(super().__sub__(other))

    def __rsub__(self, other):
        return type(self)(super().__rsub__(other))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52834400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档