#!/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 wyjątku, który zostaje wyrzucony, jeżeli dodawany punkt ma inny wymiar niż 3.""" pass def is_numeric(x): """funkcja sprawdzajca czy każdy element z przekazanej listy zawiera tylko liczby""" for i in x: if (isinstance(i, (int, float)) == True): return True else: return False class Point(object): """Klasa reprezentujaca punkt""" lista_pktow = [] def __init__(self, coordinates=list): """Inicjalizator punktu przyjmuje jako parametr 3-elementowa liste koordynatow""" if isinstance(coordinates, list): if len(coordinates) == 3: if not is_numeric(coordinates): #jesli koordynaty nie zawieraja wartosci liczbowych zostaje wyrzucony wyjatek raise Exception('Lista zawiera wartosci nieliczbowe') else: #atrybuty klasy Punkt: coordinates (lista wspolrzednych [x,y,z]); x ; y; z self.coordinates = coordinates self.x = coordinates[0] self.y = coordinates[1] self.z = coordinates[2] self.lista_pktow.append(self.coordinates) else: # jesli punkt ma inny wymiar zostaje wyrzucony wyjatek raise DimensionError('Wspolrzedne musza miec 3 wymiary!') else: print('parametrem musi byc lista!') def add(punkt1, punkt2): """metoda add dodaje wspolrzedne obiektow typu punkt i dodaje nowy obiekt punkt""" punkt3 = [] if not isinstance(punkt1, Point): if not isinstance(punkt2, Point): #jesli parametry metody add nie sa obiektami typu punkt zostaje wyrzucony komunikat print('zly typ parametru! - parametrem musi byc obiekt typu Punkt') else: print('zly typ parametru! - parametrem musi byc obiekt typu Punkt') else: if punkt1.coordinates and punkt2.coordinates in Point.lista_pktow: #jesli parametry metody add sa obiektami typu punkt - wspolrzedne x,y,z sa sumowane i zostaje zwracany nowy obiekt typu punkt punkt3.append(punkt1.x+punkt2.x) punkt3.append(punkt1.y+punkt2.y) punkt3.append(punkt1.z+punkt2.z) return Point(punkt3) else: print('Nie ma takich punktow!') def __len__(self): """metoda len zwraca liczbe wspolrzednych - zawsze bedzie 3 bo tak zostalo zdefiniowane w inicjalizatorze""" return len(self.coordinates) def to_string(self): """metoda to_strng przedstawia wspolrzedne w czytelnej postaci""" return (f'Koordynaty punktu: [{self.x}, {self.y}, {self.z}]') def __str__(self): """Wyświetla obiekt typy Point korzystając z funkcji print""" return self.to_string() print('-------') punkta = Point([1,5,6]) print(punkta.coordinates) print(Point.lista_pktow) punktb =Point([1,-3,-2]) print(punktb.coordinates) print(Point.lista_pktow) print(punkta.__len__()) print(punkta.z) print('-------') punkt3 = Point.add(punkta,punktb) print(punkt3.coordinates) print(punkt3.z) print(Point.add(punkta,punktb)) print('-------') print(Point.lista_pktow) print(punkta.to_string()) print(punktb) print(punkta)