17.1 Typy również są obiektami

>>> type(5)
<class 'int'>
>>> type(["cześć", "czołem"])
<class 'list'>


>>> wynik_type = type(5)
>>> type(wynik_type)
<class 'type'>

17.2 Korzystanie z typów

>>> type("cześć") == type("czołem")
True
>>> type("cześć") == type(5)
False

17.3 Typy i klasy zdefiniowane przez użytkownika

>>> class A:
...     pass
...
>>> class B(A):
...     pass
...

>>> b = B()

>>> type(b)
<class '__main__.B'>

>>> b.__class__
<class '__main__.B'>

>>> b_class = b.__class__

>>> b_class == B
True

>>> b_class.__name__
'B'

>>> b_class.__bases__
(<class '__main__.A'>,)


>>> class C:
...     pass
...
>>> class D:
...     pass
...
>>> class E(D):
...     pass
...
>>> x = 12
>>> c = C()
>>> d = D()
>>> e = E()
>>> isinstance(x, E)
False
>>> isinstance(c, E)                                #1
False
>>> isinstance(e, E)
True
>>> isinstance(e, D)      #2
True
>>> isinstance(d, E)                                #3
False
>>> y = 12
>>> isinstance(y, type(5))                          #4
True

>>> issubclass(C, D)
False
>>> issubclass(E, D)
True
>>> issubclass(D, D)                                 #5
True
>>> issubclass(e.__class__, D)
True

17.5 Czym jest specjalny atrybut metody?

>>> from modul_kolor import Kolor
>>> k = Kolor(15, 35, 3)

>>> print(k)
Kolor: R=15, G=35, B=3

17.6 Obiekty zachowujące się jak listy

obiekt_pliku = open(nazwa_pliku, ‘r’)
linie = obiekt_pliku.readlines()
obiekt_pliku.close()
for linia in linie:
  ... zrób coś...


obiekt_pliku = open(nazwa_pliku, ‘r’)
for linia in obiekt_pliku:
  ... zrób coś...
obiekt_pliku.close()

17.7 Atrybut metody __getitem__

class CzytnikLinii:
    def __init__(self, nazwa_pliku):
        self.obiekt_pliku = open(nazwa_pliku, 'r')    #A
    def __getitem__(self, indeks):
        linia = self.obiekt_pliku.readline()    #B
        if linia == "":    #C
            self.obiekt_pliku.close()    #C
            raise IndexError    #D
        else:
            return linia.split("::")[:2]    #E

for imie, wiek in CzytnikLinii("plik"):
    ...zrób coś...


import narzędzia_pomocnicze
for imie, wiek in narzędzia_pomocnicze.CzytnikLinii("plik"):
    ...zrób coś...

17.8 Obiekt o wszystkich możliwościach listy

class ListaTypizowana:
    def __init__(self, przykladowy_element, poczatkowa_lista=[]):
        self.typ = type(przykladowy_element)    #1
        if not isinstance(poczatkowa_lista, list):
            raise TypeError("Drugim argumentem ListyTypizowanej musi byc lista")
        for element in poczatkowa_lista:
            if not isinstance(element, self.typ):
                raise TypeError("Proba dodania elementu niewlasciwego typu do typizowanej listy") 
        self.elementy = poczatkowa_lista[:]


class ListaTypizowana:
    def __init__(self, przykladowy_element, poczatkowa_lista=[]):
        self.typ = type(przykladowy_element)
        if not isinstance(poczatkowa_lista, list):
            raise TypeError("Drugim argumentem ListyTypizowanej musi byc lista")
        for element in poczatkowa_lista:
            self.__sprawdz(element)
        self.elementy = poczatkowa_lista[:]
    def __sprawdz(self, element):
        if type(element) != self.typ:
            raise TypeError("Proba dodania elementu niewlasciwego typu do typizowanej listy") 
    def __setitem__(self, i, element):
        self.__sprawdz(element)
        self.elementy[i] = element
    def __getitem__(self, i):
        return self.elementy[i]

>>> x = ListaTypizowana("", 5 * [""])
>>> x[2] = "Dzień"
>>> x[3] = "dobry"
>>> print(x[2] + ' ' + x[3])
Dzień dobry
>>> a, b, c, d, e = x
>>> a, b, c, d
('', '', 'Dzień', 'dobry')

17.9.1 Pochodne od listy

class ListaTypizowana(list):
    def __init__(self, przykladowy_element, poczatkowa_lista=[]):
        self.typ = type(przykladowy_element)
        if not isinstance(poczatkowa_lista, list):
            raise TypeError("Drugim argumentem ListyTypizowanej musi byc lista")
        for element in poczatkowa_lista:
            self.__sprawdz(element)
        super().__init__(poczatkowa_lista)
    def __sprawdz(self, element):
        if type(element) != self.typ:
            raise TypeError("Proba dodania elementu niewlasciwego typu do typizowanej listy") 
    def __setitem__(self, i, element):
        self.__sprawdz(element)
        super().__setitem__(i, element)
>>> x = ListaTypizowana("", 5 * [""])
>>> x[2] = "Dzień"
>>> x[3] = "dobry"
>>> print(x[2] + " " + x[3])
Dzień dobry
>>> a, b, c, d, e = x
>>> a, b, c, d
('', '', 'Dzień', 'dobry')
>>> x[:]
['', '', 'Dzień', 'dobry', '']
>>> del x[2]
>>> x[:]
['', '', 'dobry', '']
>>> x.sort()
>>> x[:]
['', '', '', 'dobry']

17.9.2 Pochodne klasy UserList

from collections import UserList
class ListaTypizowana(UserList):
    def __init__(self, przykladowy_element, poczatkowa_lista=[]):
        self.typ = type(przykladowy_element)
        if not isinstance(poczatkowa_lista, list):
            raise TypeError("Drugim argumentem ListyTypizowanej musi byc lista")
        for element in poczatkowa_lista:
            self.__sprawdz(element)
        super().__init__(poczatkowa_lista)
    def __sprawdz(self, element):
        if type(element) != self.typ:
            raise TypeError("Proba dodania elementu niewlasciwego typu do typizowanej listy") 
    def __setitem__(self, i, element):
        self.__sprawdz(element)
        self.data[i] = element
    def __getitem__(self, i):
        return self.data[i]
>>> x = ListaTypizowana("", 5 * [""])
>>> x[2] = "Dzień"
>>> x[3] = "dobry"
>>> print(x[2] + " " + x[3])
Dzień dobry
>>> a, b, c, d, e = x
>>> a, b, c, d
('', '', 'Dzień', 'dobry')
>>> x[:]
['', '', 'Dzień', 'dobry', '']
>>> del x[2]
>>> x[:]
['', '', 'dobry', '']
>>> x.sort()
>>> x[:]
['', '', '', 'dobry']


