int
をサブクラス化して可変にすることはできますか?私はビットのベクトルに素敵なインターフェイスをしようとして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
は不変なので、ビットベクトル値を設定することはできません。
私のようなセッターの1書き換える場合:
@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
を変更するにはどうすればよいですか?
これを行うには狂気のハックはありますか?たぶん、メタクラスなどを使用していますか?
UPDATE
私は要件を言及するのを忘れてしまった:CustomBitVector
の
インスタンスは、int
のように振る舞う必要があります。特に、私はそれらを渡すことができる必要がありますstruct.pack
整数を変更可能にすることはできません(Cで拡張を記述しない限り)が、拡張する代わりに確実に使用できます。 –