我有一些set和frozenset子类,分别是OCDSet和OCDFrozenSet。当我在二进制操作中将它们与它们的祖先类的实例一起使用时,祖先类将控制结果的类型–我的意思是,当我从OCDFrozenSet中减去frozenset时,得到的…,但是如果我反转操作中的类型(即从frozenset中减去frozenset),情况也是如此。像这样:……对我而言,尤其令人反感的是,使用OCDFrozenSet(原位减法)会改变现有实例的类型!我对如何处理此类事情的了解完全来自C ++,在C ++中,操作的类型是已被放弃的结论,该结论已在(可能是模板化的)运算符重载函数中明确指定;在Python中,类型系统通常更加隐式,但是它并没有像我现在所相信的那样就地具有不可预测的可变性。那么,解决这个问题的最方便的方法是什么-我认为它涉及在感兴趣的子类中覆盖一些带有双下划线的实例方法吗? 最佳答案 就地操作不保证它们将就地更新对象,这完全取决于对象的类型。元组,frozenset等是不可变的类型,因此无法就地更新它们。从library reference到就地操作员:  对于字符串,数字和元组之类的不可变目标,将计算更新后的值,但不会将其分配回输入变量。类似地,frozenset文档也提到了同一件事about in-place operations [source]:  下表列出了可用于set的操作,这些操作不适用于Frozenset的不可变实例。现在,由于您的OCDFrozenSet没有实现__isub__,它将回退到__sub__方法,该方法将返回基类frozenset的类型。使用基类是因为Python不了解您的基类在frozenset操作中新创建的__sub__上期望的参数。更重要的是,这是一个bug in Python 2,其中此类操作返回了子类实例,但为了防止破坏现有系统,该修补程序仅为ported to Python 3。为了获得预期的输出,您可以在子类中提供所需的方法:class OCDFrozenSet(frozenset): def __sub__(self, other): return type(self)(super().__sub__(other)) def __rsub__(self, other): return type(self)(super().__rsub__(other))关于python - 在进行二进制操作时,如何使我的Python`set`和`frozenset`子类保留其类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52834400/
10-13 05:47