能否对int
进行子类化并使其可变?
考虑以下类:
class CustomBitVector(int):
# bit 7
@property
def seventh_property(self):
return bool(self & (1 << 7))
@seventh_property.setter
def seventh_property(self, val):
self |= bool(val) << 7
# bit 6
@property
def sixth_property(self):
return bool(self & (1 << 6))
@sixth_property.setter
def sixth_property(self, val):
self |= bool(val) << 6
# ... a few more of these ...
# bit 0
@property
def zeroth_property(self):
return bool(self & (1 << 0))
@zeroth_property.setter
def zeroth_property(self, val):
self |= bool(val) << 0
我想要为一个位向量创建一个友好的界面。我正在从套接字读取专有协议,并且我已经制作了代表我发送/接收的消息的类。通常,这些消息包括位向量,以便更好地处理它们。
已经可以很好地读取位向量值,但是设置操作不起作用,因为int
是不可变的。
如果我像这样重新编写其中一个setter:
@sixth_property.setter
def sixth_property(self, val):
print 'before:', self
self |= bool(val) << 6
print 'after:', self
然后我得到了这种行为:
In [2]: c = CustomBitVector()
In [3]: c.sixth_property
Out[3]: False
In [4]: c.sixth_property = True
before: 0
after: 64
In [5]: c
Out[5]: 0
In [6]: c.sixth_property
Out[6]: False
我发现我的失误...我在给self
赋值而不是修改它。在这种情况下,我该如何修改self
呢?
有什么疯狂的办法可以做到这一点吗?也许使用元类或其他什么东西?
我忘了提一个要求:
CustomBitVector
的实例必须像int
一样运作。特别地,我需要能够将它们传递给struct.pack
函数。