2017-08-03 39 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中的運算符overloader,並攔截了p1-p2調用。但是它如何與兩個不同的課程實例一起工作呢?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) 。在p1上調用__sub__函數,返回所做的計算和新的Point對象。

+1

那麼......一如既往,完全正確的每一個字:D,它是一個加號的朋友。 –

+0

cᴏʟᴅsᴘᴇᴇᴅ感謝編輯!現在更專業了;) –

1

現在你編輯的問題,答案很簡單:

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

你在你的例子有兩個點作爲參數self, other,所以,自我,顯然是p1,以及其他爲p2 ,在做完所有的計算之後,你返回一個新的,所以,p1p2都沒有修改。

重要的建議

最罕見的事情,是你把它__sub__,但事實上,你實際上是加入!我的意思是,請......要麼更改方法定義並替換+ by - ,要麼更改__sub__ ......只是一條建議。

+0

「你稱它爲子,但實際上,你實際上是增加了」我想這就是操作符重載的全部重點。通過攔截操作執行任意操作 - 在這種情況下減去。 –

+1

@SamRohn當然!請不要誤解我,這個建議只針對那些可能使用你的代碼的人,而且......想象一下,在學校裏他們教這個總和的兩點是:sum x和y,sub,sub x和y,所以當我做p1 - p2的時候,我希望這個分...沒有總和...我希望我很清楚,我希望我的回答對你有所幫助 –

+0

更專業,值得肯定的+1:p –