Klasy
Klasy tworzymy za pomocą instrukcji class
.
Każda klasa nowego typu dziedziczy
bezpośrednio lub pośrednio po object
.
class MojaKlasa(object): '''Moja przykładowa klasa''' pole_klasy = None def __init__(self, x): self.pole_obiektu = x def __str__(self): return 'MojaKlasa(%s)' % self.pole_obiektu def metoda(self): return 2*self.pole_obiektu
Funkcja super
Jeśli w klasie potomnej implementujemy
metodę zdefiniowaną już w klasie bazowej, a chcemy wywołać metodę z klasy bazowej,
używamy funkcji super
.
class A(object): def __init__(self, *args, **kwargs): print 'A:', args print 'A:', kwargs class B(A): def __init__(self, *args, **kwargs): print 'B: przed super' super(B, self).__init__(*args, **kwargs) print 'B: po super' B('argument 1', arg2=123) > B: przed super > A: ('argument 1',) > A: {'arg2': 123} > B: po super
W przypadku dziedziczenia po wielu klasach pojawia się pytanie: z której z nich zostanie wzięta metoda, którą wywołujemy? Pojawia się w szczególności problem diamentu. Odpowiedzią na to pytanie jest algorytm C3 linearization używany w Pythonie, opisany również w wikipedii.
Metody specjalne
W celu np. przeciążenia operatorów
musimy zdefiniować metody specjalne, np. __add__
, __mul__
itp.
Zwróć szczególną uwagę na metody __str__
, __repr__
,
__init__
, __call__
.
Zadania
-
Napisz moduł, w którym zawarta będzie klasa
Wektor2d
. Przeciąż operatory dodawania, odejmowania wektorów; mnożenia i dzielenia przez liczbę. -
Dodaj do modułu klasę do reprezentowania punktów. Zaprogramuj operację translacji punktu o wektor w formie operatora dodawania. Różnica dwóch punktów powinna dać jako wynik wektor.
-
Zdefiniuj parę funkcji przyjmujących parametr
n
, które zwrócą klasy do reprezentowania wektorów i punktów w przestrzenin
-wymiarowej. Postaraj się, by funkcjalen()
po podaniu jej obiektu wektora lub punktu (jako argument) zwracała jego wymiar.