TI/Skrypty z zajęć/kz15-17

Z Brain-wiki
Wersja z dnia 18:24, 3 cze 2020 autorstwa Tgub (dyskusja | edycje) (Utworzono nową stronę "<source lang="python"> # -*- coding: utf-8 -*- ''' Zadanie 15 Przepisz klasę ciąg arytmetyczny z zadania 8, tak by zwracała odpowideni wyjątek przy odwołaniu się d...")
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)
# -*- coding: utf-8 -*-
'''
Zadanie 15
Przepisz klasę ciąg arytmetyczny z zadania 8, tak by zwracała odpowideni wyjątek przy odwołaniu się do niewłasciwego elementu
'''

class CiagArytmetyczny():
    def __init__(self, a1, r):
        self.__a1 = float(a1)
        self.__r = float(r)

    def __get_a1__(self):
        return self.__a1

    def __get_r__(self):
        return self.__r
    
    def __set_a1__(self, a1):
        self.__a1 = float(a1)

    def __set_r__(self, r):
        self.__r = float(r)
    
    a1 = property(__get_a1__,__set_a1__)
    r = property(__get_r__,__set_r__)
    
    def __getitem__(self,n):
        if isinstance(n,int):
            if n < 1: raise IndexError 
            return self.__a1 + (n-1)*self.__r
        raise TypeError
    
    def __add__(self, other):
        return CiagArytmetyczny(self.a1 + other.a1, self.r + other.r)

    def __str__(self):
        return 'CiagArytmetyczny a1 = '+str(self.__a1)+' r = '+str(self.__r)
    
    def __repr__(self):
        return str(self)
    
'''
Zadanie 16
Początek jak w zadaniu 9:
"Napisz klasę CiągArytmetycznyZeSlownikiem, która dziedziczy po klasie 
CiągArtymetyczny. Zaimplementuj w niej metodę __setitem__, która będzie
 zapisywać wywołane klucze i wartości do prywatnego słownika. 
Klasa powinna zapewniać dostęp do tego słownika, ale bez możliwości jego edycji."
ale tym rezem można już używać super(). Nadpisz również metodę __getitem__ tak, by zwracała wartosci wczesniej przypisane 
przez __setitem__. Skorzystaj z try except 
'''

class CiagArytmetycznyZeSlownikiem(CiagArytmetyczny):
      
    def __init__(self,*args, **kwargs):
        super().__init__(*args, **kwargs)
        self.__sl = {}
        
    
    def __setitem__(self, key, value):
        self.__sl[key] = value
        
    @property
    def sl(self):
        return self.__sl.copy()

    def __str__(self):
        return 'CiagArytmetycznyZeSlownikiem a1 = '+str(self.a1)+' r = '+str(self.r)

    def __getitem__(self,n):
        try:
            return self.__sl[n]
        except:
            return super().__getitem__(n)

'''
Zadanie 17
Napisz dekorator mierzący czas działania funkcji i wypisujący ten czas przy każdym wywołaniu.
'''
import time

def timeit(fun):
    def f(*args, **kwargs):
        start = time.time()
        result = fun(*args, **kwargs)
        stop = time.time()
        print('Obliczenie trwalo',stop-start,'s')
        return result
    return f