TI/Skrypty z zajęć/kz7-9

Z Brain-wiki
# -*- coding: utf-8 -*-
"""
Created on Tue May 26 11:12:02 2020

@author: Tomek
"""

'''
Zadanie 7
Napisze klasę InnyNawias. Konstruktor klasy przyjmuje jeden parametr: 
 jednoargumentową funkcję f. Zapisz otrzymaną funkcję w zmiennej prywatnej. 
 Zaimplementuj metodę __getitem__(x), która ma zwracać f(x).
'''

#zadanie 7
class InnyNawias():
    def __init__(self, f):
        self.__f = f
        
    def __getitem__(self, x):
        return self.__f(x)

def fun(x):
    return x*x

z = InnyNawias(fun)

'''
Zadanie 8
Napisz klasę CiągArtymetyczny, która:
-przyjmuje w konstruktorze dwa argumenty a1 oraz r, które są pierwszym 
elementem ciągu oraz różnicą ciągu. Zachowaj argumenty w zmiennych prywatnych,
 ale zapewnij do nich dostęp poprzez property.
-ma zaimplementowaną metodę __getitem__, która zwraca odpowiedni element ciągu
 (lub None, gdy jej argument nie jest liczbą naturalną)
- Ma zaimplementowaną metodę dodawania ciągów arytmetycznych

'''


#zadanie 8
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 > 0):
                return self.__a1 + (n-1)*self.__r
    
    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)
    
z = CiagArytmetyczny(1,1)
x = CiagArytmetyczny(100,1)
#print(x+z)

'''
Zadanie 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.
'''

class CiagArytmetycznyZeSlownikiem(CiagArytmetyczny):
      
    def __setitem__(self, key, value):
        if not ('_CiagArytmetycznyZeSlownikiem__sl' in dir(self)):
            self.__sl = {}
        self.__sl[key] = value
        
    @property
    def sl(self):
        if not ('_CiagArytmetycznyZeSlownikiem__sl' in dir(self)):
            self.__sl = {}
        return self.__sl.copy()

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


y = CiagArytmetycznyZeSlownikiem(50,1)