2017-01-11 20 views
3

ビット演算を実行できるようにするクラスがあります。Pythonでブール演算子を使用するためのビット演算子のオーバーロード

この時点で
class Measurement(object): 
    def __init__(self, value = None, category = None, measure = None): 
     self.value = value 
     self.category = category 
     self.measure = measure  

    def __nonzero__(self): 
     return self.value.__nonzero__() 

    def __or__(self, other): 
     return self.__nonzero__() | other 

a = False 
b = Measurement(True) 

c = b | a作品が、c = a | bは型エラーを示します。どのようにして両方の方法で動作させるのですか?

さらに、これを行うためのよりエレガントな方法があります。たとえば、私は__nonzero__を定義するだけで正しい動作を得ることができると期待していましたが、そうではありません。

私はPython 2.7を使用しています。

+3

これは、私が解決したのと同じような質問を思い出させます。これは、カスタムVectorクラスの乗算演算を実装することでした。解決策は、 '__rmul__'をオーバーライドすることでした(引数を切り替えて' __mul__'を呼び出すようにしました)。これに似た解決策があるのだろうかと思います。 – Tagc

+2

@Tagcはい。 [関連ドキュメント](https://docs.python.org/3/reference/datamodel.html#emulating-numeric-types)です。 –

+1

これは、それが行われると思われる方法です。明示的なものは暗黙的なものより優れていて、それはすべて... –

答えて

2

また、__ror__を定義すると、以下のように正しく動作します。しかし、問題の第二の部分はまだ立っています。よりエレガントな方法がありますか?

def __ror__(self, other): 
    return self.__or__(other) 
+1

'__ror__' ...私はそれを知っていました。 – Tagc

+2

いいえいい方法はありません。あなたは潜在的に 'self .__ ror__ = self .__ or__'を定義することができますが、それはちょっと混乱していると思います –

関連する問題