Tuesday, December 23, 2008

Python - przeciążanie operatorów z punktu widzenia programisty C++

Cała prostota przeciążąnia operatorów w Pythonie względem C++ wynika z podanych już wcześniej zalet definiowania funkcji. Przeciążenie jakiegoś operatora w tworzonej przez nas klasie polega wyłącznie odnalezieniu nazwy funkcji za nią odpowiedzialnej, wymyśleniu jak ma działać dla naszego obiektu i zaimplementowaniu jej w naszej klasie. Z puli operatorów opisanych w dokumentacji języka PythonWeźmy na przykład operator dodawania +. Jak widzimy wystarczy w naszej klasie zdefiniować dwuargumentową metodę o nazwie __add__ i nasza klasa będzie rozumiała dodawanie. Załóżmy, że będzie to zawsze suma elementów modulo 5 (pierścień modulo pięć - dla osób pamiętających jeszcze coś z matematyki dyskretnej lub algebry liniowej).

Klasa będzie musiała przetrzymywać w sobie wartość liczby. Będziemy ją zapisywać do __value. Dodatkowo aby ułatwić sobie obliczenia nauczymy naszą klasę "konwertować się do inta" :) Bo przecież bądź co bądź chodzi o obliczenia na liczbach. 


class Mod5(object):

    def __init__(self, value):
        self.__value = value

    def __int__(self):
        return self.__value

    def __add__(self, b):
        return ((int(self) + int(b)) % 5)

if __name__ == '__main__':
    a = Mod5(5)
    b = Mod5(7)
    print a + b

Metoda __init__ pobiera jeden argument, liczbę którą jest nasz obiekt. Oczywiście nie sprawdzamy mnóstwa różnych rzeczy. czy liczba jest w naszym zakresie, czy to na pewno liczba całkowita itd... Metoda __int__ wywoła się w momencie, w którym nasz obiekt będzie konwertowany na int.  Wykorzystujemy to w metodzie __add__. Jako pierwszy argument przyjmuje samego "siebie" oraz drugi obiekt ten po symbolu "+". Konwertujemy obia te obiekty (siebie i ten drugi) na inta. Otrzymujemy więc nie obiekt klasy Mod5, ale liczbę :) dodajemy je i robimy modulo 5. Linijki poniżej to już tylko test - czy działa :)

Jak widać przeładowywanie operatorów, czy nawet modelowanie klasy, która będzie miałą możliwość rzutowania na najróżniejsze inne typy (naprawdę tutaj są ogromne możliwości, może być rzutowana na complex, long nawet na listę czy krotkę), wszystko to jest banalnie proste i łatwe :) Wystarczy zajrzeć do odpowiednigo działu dokumentacji Pythona :) i 

No comments: