0

Python3 でクラスのいわゆる「マジック」属性または関数の多くを再定義している状況に陥っています ( __add____sub__など)。

これらすべてに対して、同じ 2 行のコードを実装します。

arg1 = self.decimal if isinstance(self, Roman) else self
arg2 = other.decimal if isinstance(other, Roman) else other

これらの行が何をするかの詳細は重要ではありませんが、コードの冗長性が気になります。これとREPLで呼び出されている間の中間にある別の「魔法の」関数はありますか?

例えば:

>> Class(9) + Class(3)
... (somewhere in python module)
... def __magicFunction__(self, rhs):
...   arg1 = self.decimal if isinstance(self, Roman) else self
...   arg2 = other.decimal if isinstance(other, Roman) else other
... 
... THEN
...
... def __add__(self, rhs):
...   return arg1 + arg2
...
12

次のようなスタックトレースを使用します。

Traceback (most recent call last):  
  File "< stdin>", line 1, in < module>  
  File "/home/module.py", line 105, in ```__magicFunction__```  
  File "/home/module.py", line 110, in ```__gt__```  

これが理にかなっていることを願っています...

4

1 に答える 1

1

別の魔法の関数については知りませんが、おそらく、あなたがいるクラスの arg1 と arg2 を永続変数にするのと同じくらい生産的でしょう。次に、他のすべての魔法の関数内から呼び出すクラスのメソッドを作成します。

編集:

実際、getattr を使用しないのはなぜですか。したがって、各マジック関数は次のようになります。

def __add__(self, rhs):
  return getattr(self, 'decimal', self) + getattr(other, 'decimal', other)
于 2014-10-13T06:52:23.393 に答える