2016-11-10 251 views
0

我試圖做一個程序中使用__add __添加矢量:「詮釋」對象有沒有屬性「X」

class vects: 
    def __init__(self,x,y): 
     self.x = x 
     self.y = y 

    def __add__(self, vect): 
     total_x = self.x + vect.x 
     total_y = self.y + vect.y 
     return vects(total_x, total_y) 

plusv1 = vects.__add__(2,5) 
plusv2 = vects.__add__(1,7) 
totalplus = plusv1 + plusv2 

產生的誤差如下:

line 12, in <module> plusv1 = vects.__add__(2,5) 
line 7, in __add__ total_x = self.x + vect.x 
AttributeError: 'int' object has no attribute 'x' 
+1

您正在使用的功能應該作爲從跟隨就我的理解你的代碼:'vects .__添加__(vects(2,5))',而不是'vects .__添加__(2,5 )'因爲__add__定義只等待1個參數,它似乎是vects類的另一個實例 – Artemis

回答

2

你不't使用__add__就是這樣! :-) __add__將在Vects類的實例上使用+時隱式調用。

所以,你首先應該做的是初始化雙載體實例:

v1 = Vects(2, 5) 
v2 = Vects(1, 7) 

,然後將它們添加:

totalplus = v1 + v2 

如果你添加一個漂亮的__str__讓您的新的一個很好的代表矢量:

class Vects: 
    def __init__(self,x,y): 
     self.x = x 
     self.y = y 

    def __add__(self, vect): 
     total_x = self.x + vect.x 
     total_y = self.y + vect.y 
     return Vects(total_x, total_y) 

    def __str__(self): 
     return "Vector({}, {})".format(self.x, self.y) 

您可以通過打印的方式獲得totalplus的視圖:

print(totalplus) 
Vector(3, 12) 
+0

注意到感謝您的幫助:) – jack

+0

但是我不會說直接調用類中的__add__方法,像'MyClass .__ add __(object1,object2)',是絕對沒用的。好的,Python並不是真正爲這種事情設計的,但它可以用在一個非常複雜的投射案例中,具有多重繼承,其中一個人想要調用另一個類的'__add__'方法。因爲某些原因。這有可能發生。比你想象的要快。我猜。 –

+1

當然,如果你想有一個良好的編程風格(見[PEP-8](https://www.python.org/dev/peps/pep-0008/)),該類應該被稱爲'Vector'。 – Matthias

相關問題