#!/usr/bin/env python2 # -*- coding: utf-8 -*- """ **ćwiczenie 3 (zadanie domowe) ** Stwórz klasę ``Point``, która będzie reprezentować punkt w przestrzeni wielowymiarowej: * Konstruktor ma przyjąc tylko 1 parametr: listę współrzednych. Wykorzystaj funkcję z pierwszego zadania, żeby sprawdzić, czy lista zawiera wyłącznie liczby. * Napisz metodę add, która dida dwa punkty po współrzędnych i zwróci obiekt typu ``Punkt``. Zaimplementuj własny wyjątek ``DimensionError``, który zostaje wyrzucony, jeżeli dodawany punkt ma inny wymiar. * Napisz metodę ``to\_string``, która zwróci łancuch znakowy, który w czytelny sposób przedstawi punkt. * Napisz metodę __len__, która zwróci liczbę współrzędnych punktu. Zobacz, czy możesz teraz wywołać funkcję len na obiekcie typy punkt. * Napisz metodę __str__, która bedzie działać dokładnie tak samo jak metoda ``to_string``. Wyświetl obiekt typy Point korzystając z funkcji print. """ class DimensionError(Exception): """Klasa reprezentująca wyjątek ilości współrzędnych <> 3""" def __init__(self, text): self.text = text def __str__(self): return self.text class Point: """Klasa reprezentująca punkt w 3D. Pola publiczne: x, y , z - współrzędne punktu w 3 D """ def __is_numeric(self, my_list): """Zwraca True jeśli podana lista argumentów ma dokładnie 3 elementy typu int lub float argument my_list - lista 3 współzednych liczbowych typu int lub float""" for item in my_list: if not (isinstance(item, int) or isinstance(item, float)): return False return True and len(my_list) > 0 def __init__(self, xyz): """Konstruktor klasy Point argument xyz - lista współrzędnych punktu w 3D. Musi zawierać 3 współrzędne! """ if not self.__is_numeric(xyz): raise DimensionError("Invalid coordindates!. Check the numbers!") if len(xyz) != 3: raise DimensionError("Invalid number of coordindates! (<> 3)") self.x = xyz[0] self.y = xyz[1] self.z = xyz[2] def to_string(self): """Wypisuje wektor współrzędnych punktu w 3D jako string""" return '[' + ','.join([str(self.x), str(self.y), str(self.z)]) + ']' def add(oPoint1, oPoint2): """Metoda statyczna klasy Point. Zwraca sumę współrzędnych danych 2 punktów w 3D. arg1 - obiekt klasy Punkt arg2 - obiekt klasy Punkt """ l1 = [oPoint1.x, oPoint1.y, oPoint1.z] l2 = [oPoint2.x, oPoint2.y, oPoint2.z] nl = [c1+c2 for c1, c2 in zip(l1, l2)] return Point(nl) def __len__(self): """Zwraca liczbę współrzędnych = 3 bo punkt w przestrzeni 3D :-)""" return 3 def __str__(self): """Funkcja string dla klasy Point. Wypisuje współrzędne punktu jako string""" return self.to_string() #################################################### if __name__ == "__main__": p1 = Point([1, 2, 3]) print('p1 =', p1) p2 = Point([-3, 0, -2]) print('p2 =', p2) p3 = Point.add(p1, p2) print('p3 = p1 (+) p2 = ', p3)