我继承自int,因为我想为按位操作实现一个简单的接口。由于int的不可变性,我必须使用整数成员函数,如int.__and__
,...。
class Bitset(int)
...
def __setitem__(self, index, value):
if value:
self.__ior__(1 << int(index))
else:
self.__iand__(~(1 << int(index)))
在我的一个成员函数中,我想使用|=
和&=
函数,但整数没有__ior__
和__iand__
成员函数。所以我的问题是如何解决这个问题?。
我不想简化二进制操作,我想操纵整数的位。 E.g。
a = Bitset(0)
a[0]
>>>0
a[0] = 1
a[0]
>>>1
但我不想重新实现每个整数操作,这仍然可以正常工作。如果我包装一个内部整数,我必须这样做。 E.g
a = Bitset(0)
a += 1
应该仍然有用。
答案 0 :(得分:1)
已经有用于按位运算的简单接口(参见http://docs.python.org/reference/expressions.html#summary),例如:
4 >> 1
# 2
你没有__ior__和__iand__,但你确实有__and__和__or__。 但我怀疑你想要的实际上是__ror__和__rand__,它们实现了按位运算。整数确实有最后的魔术方法。关于魔术方法,请参阅:http://www.rafekettler.com/magicmethods.html#numeric
答案 1 :(得分:1)
int
不是可订阅的,也不是不可变的,因此您无法编写有效的__setindex__()
方法。似乎描述基本上是一个可变的位向量类,例如this one似乎是由Guido编写的。您可以使用提供的__int__()
和__long__()
方法将其转换为整数值(尽管我认为您不再需要后者)。