2017-08-03 8 views
0
class Point: 

    def __init__(self, x = 0, y = 0): 
     self.x = x 
     self.y = y 

    def __sub__(self, other): 
     x = self.x + other.x 
     y = self.y + other.y 
     return Point(x,y) 

p1 = Point(3, 4) 
p2 = Point(1, 2) 
result = p1-p2 
print(result.x, result.y) # prints (4,6) 

誰でも上記のコードの仕組みを説明できますか。その周りに私の頭を得ることができません。 私は__sub__がpythonの演算子オーバーローダであり、p1-p2呼び出しをインターセプトすることを理解しています。しかし、クラスの2つの別々のインスタンスでどのように動作しますか?Python __sub__クラスインスタンスでの使用

+0

特定の部分はありますか? –

+1

'p1-p2'は' p1 .__ sub __(p2) 'コールを返します... –

+2

これは' __add __() 'メソッドの実装に似ていて、' __sub __() 'ではありません。どのように動作しますか: 'p1-p2'は' p1 .__ sub __(p2) 'に変わります。 – jasonharper

答えて

1

__sub__ はあなたがp1 - p2を行う際

さておき、それはp1.__sub__(p2)と同じであることを... -算術演算子の魔法の方法と同等、なぜあなたはがそれらをを追加しているので、わからないことになっています。 __sub__関数がp1で呼び出され、計算が行われ、新しいPointオブジェクトが返されます。

+1

いつものように、まったく正しいすべての単語:D、それはプラスのひとりです。 –

+0

編集のためのcᴏʟᴅsᴘᴇᴇᴅありがとう!より専門的な今;) –

1

は今、あなたは質問を編集し、答えは簡単です:

p1 = Point(3, 4) 
p2 = Point(1, 2) 
result = p1-p2 

あなたがp1だろうあなたの例では、明らかに、引数self, otherので、自己として2点を持ち、もう一方はp2ですすべての計算を行った後、新しいポイントが返されるため、p1p2は変更されません。

最もレア物の重要なアドバイスは、あなたがそれ__sub__を呼び出すことですが、確かに、あなたが実際にあるを追加します!つまり、メソッドの定義を変更して+ by - を置き換えるか、__sub__ ...ちょっとしたアドバイスを変更してください。

+0

"あなたはそれをサブと呼んでいますが、実際には、私はそれがオペレータのオーバーロードの全体のポイントだと思います。この場合、操作をインターセプトして任意の操作を実行します。 –

+1

@SamRohnもちろん!私のことを誤解してはいけません。このアドバイスはあなたのコードを使う人のためのものです。想像してみましょう。学校では、2点の合計はxとyの和、sub、だから、私はp1 - p2をするとき、私はこのサブを願っています...合計ではない...私は私が明確であったことを願っています、そして私の答えはあなたを助けてくれることを願っています –

+0

確かに+1の専門家と価値がある: –