• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Python - przeciążanie operatorów

+1 głos
4,722 wizyt
pytanie zadane 9 lipca 2019 w Python przez Jakub 0 Pasjonat (23,120 p.)
zamknięte 9 lipca 2019 przez Jakub 0

Witam, od niedawna uczę się języka python ( poza C++ ), napisałem prostą testową klasę:

class Point:

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

    def __str__(self):
        return f"{self.name}({self.x}, {self.y})"

    def __eq__(self, other):
        if self.x == other.x and self.y == other.y:
            return True
        return False

    def __add__(self, other):
        return Point("none", self.x + other.x, self.y + other.y)

    def __sub__(self, other):
        return Point("none", self.x - other.x, self.y - other.y)

    def multiplication_by_number(self, n):
        return Point(self.name, self.x * n, self.y * n)

Moje pytanie dotyczy przeciążeń metod dla różnych typów, wiem jak np. zrobić metodę która pomnoży przez siebie dwa punkty ( __mult__ ), co jednak jeśli chcę zrobić przeciążenie mnożenia punktu przez liczbę typu float a nie obiektu tej samej klasy? Tzn:

p3 = p3 * 10

bo na razie umiem to zrobić tylko tak:

p3 = p3.multiplication_by_number(10)

w c++ obie metody wyglądały by w ten sposób:

Point operator*(Point p);
Point operator*(int n);

używając C++ mogę zrobić własną metodę czy niezależną funkcję dla każdego typu obiektów... ale w pythonie typy dobierane są automatycznie, czy jest w ogóle możliwość zrobienia czegoś takiego?

Z góry dziękuje za pomoc i pozdrawiam ;)

komentarz zamknięcia: problem rozwiązany

1 odpowiedź

+2 głosów
odpowiedź 9 lipca 2019 przez Benek Szeryf (93,370 p.)
wybrane 9 lipca 2019 przez Jakub 0
 
Najlepsza

Sprawdź po prostu typy danych, które przekazujesz do metody. Dodatkowo, aby zachować przemienność mnożenia, skorzystaj z metody __rmul__:

class Point:

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

    def __mul__(self, other):
        if type(other) == type(self):
            return Point(self.x*other.x, self.y*other.y)
        if type(other) == int or type(other) == float:
            return Point(other*self.x, other*self.y)

    def __rmul__(self, other):
        return self.__mul__(other)

    def __str__(self):
        return f'P({self.x}, {self.y})'


if __name__ == "__main__":
    p1 = Point(4, 6)
    p2 = Point(5, 2)

    print(p1)
    print(p2)
    print("")
    print(p1*p2)
    print("")
    print(p1*3)
    print(3*p1)
    print("")
    print(p2*2.56)
    print(2.56*p2)
2
komentarz 10 lipca 2019 przez RafalS VIP (122,820 p.)

zamiast:

if type(other) == int or type(other) == float:

lepiej użyć:

if isinstance(other, float):

isinstance sprawdza polimorficznie subklasy, porównywanie type nie

komentarz 11 lipca 2019 przez Benek Szeryf (93,370 p.)

Dzięki yes

Podobne pytania

0 głosów
1 odpowiedź 291 wizyt
0 głosów
1 odpowiedź 514 wizyt
0 głosów
1 odpowiedź 828 wizyt

93,692 zapytań

142,611 odpowiedzi

323,220 komentarzy

63,220 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...