Showing posts with label polimorfizm. Show all posts
Showing posts with label polimorfizm. Show all posts

Monday, December 22, 2008

Python - polimorfizm z punktu widzenia programisty C++

Właściwie temat był już poruszany w wątku, w którym napisałem kilka słów o wyłapywaniu wyjątków.

Ponieważ zarówno w przypadku metod jak i funkcji nie trzeba definiować typu obiektów, które są do nich przekazywane wszystkie metody zachowują się tak jakby były wirtualne. Choć ciężko o tym mówić przy braku deklaracji typu parametru - po prostu są wywoływane na obiekcie przekazanym do funkcji czy metody jaki by ten obiekt nie był. Tak zwany polimorfizm najlepiej zobaczyć we wspomnianym już powyżej przykładzie wyłapywania wyjątków. Wyłapując wyjątek klasy bazowej możemy obsługiwać tym samym blokiem również wszystkie wyjątki klas pochodzących od niej (pochodnych). W C++ wymaga to użycia funkcji wirtualnych :] (jak można zobaczyć tutaj). Python po prostu - tak działa :) Jest to jego naturalne zachowanie, o które nie musimy w żaden sposób zabiegać.

Polimorfizm w Pythonie

Ostatnio programując w C++ walczyłem z polimorficznymi wyjątkami. Sytuacja zgrała się z trafieniem po drodze na lekturę Thinking in Python, gdzie zauważyłem bardzo ciekawe podejście autora, który czasami pisze "w C++ musiałeś to i to a w Pythonie - po prostu działa". Szalenie mi to podejście odpowiada :) Tak więc w myśl tej idei postanowiłem sprawdzić jak ma się polimorfizm wyjątków w Pythonie i czy dużo więcej się namęcze. Po raz kolejny :) punkt za prostotę dla Pythona - po prostu działa :]
class MyException(Exception):
    def __init__(self, message):
        self.message = message
    def __str__(self):
        return repr(self.message)

class MySocketException(MyException):
    pass

class MyOtherException(MyException):
    pass

def f():
    raise MyOtherException("Moj wyjatek: Wystapil straszny blad !")

if __name__ == '__main__':
try:
    f()
except MyException, e:
    print e



Czy to nie jest piękne :)