In [ ]:
class Adam(): pass
class Ewa(): pass
class Eugeniusz(Adam, Ewa): pass
class Genowefa(Adam, Ewa): pass
class Maksymilian(Adam, Ewa): pass
class Agnieszka(Adam, Ewa): pass

class Marek(Eugeniusz, Genowefa): pass
class Henryka(Maksymilian, Agnieszka): pass
class Andrzej(Marek, Henryka): pass

help(Andrzej)
Andrzej.mro()

Wielodziedziczenie

  • stare i nowe klasy w Python2
  • dziedziczenie - technika do wykorzystywania ponownie kodu
  • Deterministyczny algorytm C3 linearization
  • słowo kluczowe super
  • classname.mro() i help(classname)
  • technika delegacji pracy do innego obiektu
  • specjalizowanie działania klas
  • mixin classes - budowanie obiektu z komponentów

In [ ]:
class DostawcaBrazu(object):
    def pobierz_material(self):
        return "Braz"
        
class Kowal():
    
    def stworz(self, *przedmioty):
        material = DostawcaBrazu().pobierz_material()
        print("Zaczynam prace")
        for przedmiot in przedmioty:
            print("wykuwam z {0}: ".format(material), przedmiot)
        print("Skonczylem prace")
            
Kowal().stworz("tarcza", "miecz")

In [ ]:
class DostawcaBrazu(object):
    def pobierz_material(self):
        return "Braz"
        
class Kowal(object):
    
    def stworz(self, *przedmioty):
        material = super().pobierz_material()
        print("Zaczynam prace")
        for przedmiot in przedmioty:
            print("wykuwam z {0}: ".format(material), przedmiot)
        print("Skonczylem prace")
        
class BrazKowal(Kowal, DostawcaBrazu): 
    pass
            
BrazKowal().stworz("tarcza", "miecz")

In [ ]:
class DostawcaStali(object):
    
    def pobierz_material(self):
        return "Stal"
        
        
class StalowyKowal(Kowal, DostawcaStali):
    pass


StalowyKowal().stworz("tarcza", "miecz", "zbroja")

In [ ]:
import requests
class PodstawoweOperacje():
    
    def pobierz_dane_z_internetu(self):
        return requests.get(url="http://www.trojmiasto.pl")
        
    def parsuj_dane(self, dane):
        print("Parsuje dane")
        print(dane)
        return "Dane sparsowane"
        
        
class WykonajAsynchronicznaOperacje(PodstawoweOperacje):
    
    def wykonaj(self):
        dane = super().pobierz_dane_z_internetu()
        super().parsuj_dane(dane)
        
WykonajAsynchronicznaOperacje().wykonaj()

In [ ]:
import requests
class MockPodstawowychOperacji(PodstawoweOperacje):
    
    def pobierz_dane_z_internetu(self):
        return "Dane z internetuj"
        
    def parsuj_dane(self, dane):
        print("Parsuje dane")
        print(dane)
        return "Dane sparsowane"
        
        
class MockWykonajAsynchronicznaOperacje(WykonajAsynchronicznaOperacje, MockPodstawowychOperacji):
    pass
        
MockWykonajAsynchronicznaOperacje().wykonaj()

In [ ]:
class DoKwadratuMixin():
    
    def do_kwadratu(self, liczba):
        return liczba ** 2
    
class ObiektMatematyczny(DoKwadratuMixin):
    pass

print(ObiektMatematyczny().do_kwadratu(4))

In [ ]:
class ModelCacheMixin(object):
    CACHE_PREFIX = None

    @classmethod
    def set_cache(cls, id, value, timeout=30*60):
        cache.set(cls.CACHE_PREFIX % id, value, timeout=timeout)

    @classmethod
    def get_cached(cls, id, timeout=30*60):
        cached_object = cache.get(cls.CACHE_PREFIX % id)
        if cached_object:
            return cached_object
        else:
            entity = cls.objects.get(id=id)
            cls.set_cache(id, entity, timeout=timeout)
            return entity

    @classmethod
    def get_cache(cls, id):
        return cache.get(cls.CACHE_PREFIX % id)

    @classmethod
    def get_cached_or_none(cls, id):
        try:
            return cls.get_cached(id)
        except cls.DoesNotExist:
            return None

    @classmethod
    def get_cached_or_404(cls, id):
        try:
            return cls.get_cached(id)
        except cls.DoesNotExist:
            raise Http404()

    @classmethod
    def cache_delete(cls, id):
        cache.delete(cls.CACHE_PREFIX % id)