poprzedni temat | w górę | następny temat

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

  1. Napisz moduł, w którym zawarta będzie klasa Wektor2d. Przeciąż operatory dodawania, odejmowania wektorów; mnożenia i dzielenia przez liczbę.

  2. 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.

  3. Zdefiniuj parę funkcji przyjmujących parametr n, które zwrócą klasy do reprezentowania wektorów i punktów w przestrzeni n-wymiarowej. Postaraj się, by funkcja len() po podaniu jej obiektu wektora lub punktu (jako argument) zwracała jego wymiar.

poprzedni temat | w górę | następny temat