2010-06-24 55 views
0

我有一個Python類Vector類 - 模擬數字型

class Vector2D(object): 

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

    def mag(self): 
     return sqrt(self.x**2 + self.y**2) 

    ... 

我希望能夠繁殖的載體在一起,就像vector1 * vector2,所以我加了

def __mul__(self, v): 
     return Vector2D(self.x * v.x, self.y * v.y) 

但我也想用new_vector = some_vector * 2並返回像這樣的新矢量

def __mul__(self, factor): 
     return Vector2D(self.x * factor, self.y * factor) 

我該怎麼做?

回答

2

檢查以確定v是否爲Vector2D,並且如果不將它傳遞給float()並且適當地相乘。

1

Python中沒有函數重載,你必須手動完成。

class Vector(object): 
    def __init__(self, x, y): 
    self.x = x 
    self.y = y 
    def __mul__(self, k): 
    if type(k) == float or type(k) == int: 
     return Vector(self.x * k, self.y * k) 
    if type(k) == Vector: 
     return Vector(self.x * k.x, self.y * k.y) 
    raise "What the hell!?" 
    def __str__(self): 
    return "<%f, %f>" % (self.x, self.y) 


print Vector(1, 2) * Vector(3, 4) 
print Vector(1, 2) * 5 
+1

使用'type'還是'isinstance'更好? – colinmarc 2010-06-24 01:01:31

+0

@colinmarc:'type()'檢查特定的類型。 'isinstance()'會捕獲子類。 – 2010-06-24 01:09:50

+0

此外,將類型與'float'或'int'比較將會錯過實現類似數字行爲的其他類型。 – 2010-06-24 01:11:45

0

我對Python並不難以置信,但是我敢肯定你只寫了一個函數並檢查第二個參數的類型。

順便說一句,你爲什麼乘以矢量乘以他們的組件?這似乎完全沒用。

+0

這更多的是一個例子。我也重寫'__add__','__sub__','__lt__'等,我想知道如何使用其他向量以及常規數字操作 – colinmarc 2010-06-24 01:00:13

0

考慮你可能想用numpy來處理這類數據。

+0

我真的想避免額外的依賴 – colinmarc 2010-06-24 01:59:45