我有一些set
和frozenset
子类,分别是OCDSet
和OCDFrozenSet
。当我在二进制运算中将它们与它们的祖先类的实例一起使用时,祖先类支配着结果的类型——我的意思是,当我从frozenset
中减去一个OCDFrozenSet
时,我得到一个frozenset
……但是如果我在运算中反转类型(即从OCDFrozenSet
中减去一个frozenset
),情况也是如此。你知道吗
像这样:
…对我来说最让人恼火的是使用-=
(就地减法)会改变现有实例的类型!你知道吗
那么,解决这个问题最方便的方法是什么呢?我假设它涉及重写感兴趣的子类中的一些双下划线实例方法?你知道吗
就地操作并不保证它们会就地更新对象,它完全取决于对象的类型。你知道吗
Tuple、frozenset等是不可变的类型,因此不可能就地更新它们。你知道吗
从内建运算符上的library reference:
类似地,
frozenset
文档也提到同样的事情about in-place operations[source]:现在,由于
OCDFrozenSet
没有实现__isub__
,它将回退到__sub__
方法,该方法将返回基类frozenset
的类型。之所以使用基类,是因为Python不知道基类在__sub__
操作中新创建的frozenset
上所期望的参数。你知道吗更重要的是,这是一个bug in Python 2,其中这样的操作返回子类实例,修复方法只是ported to Python 3,尽管是为了防止破坏现有系统。你知道吗
要获得预期的输出,可以在子类中提供所需的方法:
相关问题 更多 >
编程相关推荐