2012-06-29 13 views
14

Mam klasę wektorową i zdefiniowałem metodę __mul__, aby pomnożyć wektor przez liczbę.Definiowanie aliasów metod w Pythonie?

Oto metoda __mul__:

def __mul__(self, other): 
    x = self.x * other 
    y = self.y * other 
    new = Vector() 
    new.set_pos((x, y)) 
    return new 

Moim problemem jest to, że nie wiem, która jest która między liczbą i wektorem. Jeśli self jest liczbą, self.x podnosi błąd. (Ja może pomylić w tej kwestii: Czy „inny” zawsze liczbą)

Więc znalazłem tutaj: Python: multiplication override że mogę zrobić:

__rmul__ = __mul__ 

ale w jaki sposób można to zrobić w sposób definicja klasy?

Coś jak:

def __rmul__ = __mul__ 

Odpowiedz

18

self nigdy nie będzie taki numer w __mul__() ponieważ obiekt metoda jest dołączony do nie jest liczbą, to wektor oraz z definicji jest to mnożnik.

other będzie liczbą, jeśli obiekt jest pomnożony przez liczbę. Lub może to być coś innego, na przykład inny wektor, który można przetestować i obsługiwać.

Gdy obiekt jest multiplikatorem, wywoływana jest __rmul__(), jeśli mnożnik nie wie, jak obsługiwać operację.

Aby obsłużyć przypadek, w którym __mul__ i __rmul__ powinny być tą samą metodą, ponieważ operacja jest przemienna, można po prostu wykonać przypisanie w definicji klasy.

class Vector(object): 
    def __mul__(self, other): 
     pass 

    __rmul__ = __mul__ 
9

Wystarczy wymienić go jako atrybut:

__rmul__ = __mul__ 

Jest to ta sama droga, którą utworzyć alias funkcji w module; Tworzenie aliasu metody w ciele klasy działa tak samo.

3

Chodzi o to, że w Pythonie możesz powiedzieć obiektom, jak się mnożyć przez rzeczy. Oznacza to, że

a * b 

może albo oznaczać „powiedzieć a rozmnażać się przez b” lub „powiedzieć b rozmnażać się przez a”. W kodzie, który przekłada się na

a.__mul__(b) 

lub

b.__rmul__(a) 
+0

Czy istnieje sposób sprawdzenia, który z nich zostanie nazwany? –

+1

'__mul__' najpierw, a następnie' __rmul__' jeśli to się nie powiedzie. – katrielalex

+3

lepiej: lub "powiedz b, aby pomnożyć samodzielnie (b)". Operator mnożenia nie musi być przemienny. – glglgl