5

私は、オーバーロードされた比較演算子を持つint派生クラスを持っています。int派生クラスからオーバーロードされた比較演算子を元のint比較にアクセスする

オーバーロードされたメソッドの本体では、元の演算子を使用する必要があります。

おもちゃ例:

>>> class Derived(int): 
...  def __eq__(self, other): 
...   return super(Derived, self).__eq__(other) 

は、Python 3.3+で正常に動作しますが、例外AttributeError: 'super' object has no attribute '__eq__'でのPython 2.7で失敗します。

私は、私は非常にきれいではない見つけ、いくつかのwalkarrounds、考えることができます。

try: 
    return super(Derived, self).__eq__(other) 
except AttributeError: 
    return super(Derived, self).__cmp__(other) == 0 

がベースの制御フローを分割しながら

return int(self) == other 

は、ちょうどそれを比較するために、新しいintオブジェクトを作成する必要がありますPythonのバージョンでは、私はひどく面倒です(Pythonのバージョンを明示的に調べています)。

Python 2.7および3.3+を使用して、元の整数比較をエレガントな方法で使用するにはどうすればよいですか?

+1

あなたはアクセスすることができます ''スーパー.__ eq__'経由の方法を比較int'。しかし、Pythonのバージョンによっては、組み込み型のメソッドの比較方法が大きく異なります。したがって、python2は '1つの引数(other)を必要とし、python3は2(selfとother)を必要とします。 – infotoni91

+0

' int(self)== int(other) 'はあまりにも面倒ですか? – Phillip

+0

@Phillipそれは 'int(self)== other'よりもう一つオブジェクトを作成します – abukaj

答えて

0

私は、クラスを定義する前に、をintに定義するべきだと考えています。たとえば:

int = 5 
def int.__eq__(self, other): 
    return self.real == other 
IntDerived = Derived(int) 

これはsuperクラスに__eq__属性を与える必要があります。


EDITED


は、主なアイデアは、働いていたが、コードが動作していないことを私の注意に持って来られました。だから、改良コード:

class Derived(int): 
    def __eq__(self, other): 
     return self.real == other 

Int = 5 
D = Derived(Int) 
D.__eq__(4) #Output: False 
D.__eq__(5) #Output: True 
+1

これはPythonではありません。 – Goyo

+0

@ GreenHawk1220あなたが '__eq __()'メソッドを 'Derived'クラス定義に入れて(Pythonで動かせるようにする)答えを受け入れます。 '.real'属性にアクセスするという考えは機能しますが、コードはPythonではありません。 – abukaj

+0

更新されたコードは私のために働いています。 – GreenHawk1220

2

Python 2と3は大きく異なるので、箇条書きとバージョンを確認してください。これは両方で動作するコードを作成しようとしている場合(遅かれ早かれ、私の経験ではパッチを当てなければならないものがあることがわかります)、これは予想されます。パフォーマンスの影響を避けるには、次のようなことができます。

from six import PY2 

class Derived(int): 
    if PY2: 
     def __eq__(self, other): 
      return super(Derived, self).__cmp__(other) == 0 
    else: 
     def __eq__(self, other): 
      return super(Derived, self).__eq__(other) 

これは私がやることです。私は本当にあなたが本当にしたくない場合は、int ...

をサブクラス化したい場合は、おそらくあなたは試みることができる:

class Derived(int): 
    def __eq__(self, other): 
     return (self^other) == 0 

を明らかにあなたはパフォーマンス心配している場合、あなたがして、いくつかのプロファイリングを行う必要があるでしょうあなたのコードの残りの部分が著しく悪いかどうかを調べてください。

+0

私は後者のアプローチが好きですが、 'other'が浮動小数点であるときには動作しません – abukaj

0

hasattrを使用して、例外をキャッチするか、明示的にPythonのバージョンをチェックし、新しいintオブジェクトを作成避けることができます。

以下のコードはPython 2.7と3の両方で動作します。3+:

class Derived(int): 
    def __eq__(self, other): 
     return super(Derived, self).__cmp__(other) == 0 if hasattr(Derived, "__cmp__") else super(Derived, self).__eq__(other) 
1

どちらのバージョンが__xor__メソッドを実装し、あなたがこれを試みることができる:

class Derived(int): 
    def __eq__(self, other): 
     return not super(Derived, self).__xor__(other) 
+0

私は答えが好きです。しかし、それほど清潔ではなく、フロートと比較して動作します。また、「スーパー」オブジェクトを作成する必要はないと思います。「自己」で十分です。 'self^other'はもっと簡単かもしれません。 – abukaj

関連する問題