2017-04-04 12 views
7

Pythonで逆アセンブル演算子または交差演算子を使用することに違いはありますか?Pythonで反転セット演算子を実際に使用する

例えば、

s & zs.__and__(z)

z & sこれらは同じものを返すことになっている場合s.__rand__(z)

に対応に対応して、なぜ最初の場所での逆演算子を持っていますか?何か不足していますか?

+0

左側のオブジェクトが '__and__'メソッドを実装していない場合です。 –

答えて

0

__rand__は、左側のオペランドが対応するオペレーションをサポートせず、オペランドのタイプが異なる場合にのみ呼び出されます。

s.__rand__(z)は、カバーの下にz.__and__(s)と呼ぶと思います。

+0

2つのセット以外の操作は無効なので、もう1つの引数には正しいメソッドがあることが保証されています。そうでない場合はエラーが発生し、randメソッドはそのメソッドを生成する必要はありません。 – zondo

3

setfrozensetは数字プロトコルに従います。これらはdon't define the reversed operations explicitlyですが、implement the normal methods (like __and__)であるため、これらは「無料」になります。

逆の操作は、サブクラスを扱うときに特に役に立ちます。その理由は、right operand is a subclass of the left operand the reversed operation is attempted firstの場合です。しかし、平文setfrozensetの場合、これらはお互いに継承しないので、違いはありません。

これらの逆の操作は、最初のオペランドがを返した場合にも使用されます(__add__)。しかし、もう一度setfrozensetの場合には、他のオペランドが別の場合はsetの場合はsetと少なくともsetfrozensetNotImplementedを返しません。

z & sは、szのサブクラスである場合を除き、s.__rand__(z)に対応しません。それ以外の場合は、s.__rand__(z)の前にz.__and__(s)が試行されます。

逆ユニオンと交差のユースケースはあるのでしょうか?「なぜこれらのメソッドが存在するのか」を説明する必要があります。

+0

'set'または' frozenset'を継承するカスタムクラスを作成し、これらのクラスに異なる '__and__'メソッドがあるとしたら、その序列と' __rand__'メソッドにも含まれているものを監視する必要がありますか? – MadPhysicist

+1

実際に 'set'と' frozenset'では、サブクラス化してもう一方を操作しようとするときには、順序を慎重にする必要があります。 'set'をサブクラス化して' __and__'と '__rand__'を実装すると、' set()&subclass() '(=>'サブクラス.__ rand__'が最初に呼び出される)または ' subclass()&set() '(=>'サブクラス.__と__が最初に呼び出されます)。しかし、このサブクラスを 'frozenset'で使用しようとすると、' frozenset()&subclass() 'が' frozenset .__ and__'を最初に呼び出します。 – MSeifert

関連する問題