Programowanie obiektowe

Programowanie obiektowe: obiekt a klasa klasa: cechy, metody obiekt: wartości cech dziedziczenie zwierzę pies kot mysz duza_rasa mala_rasa itp itd...
Pierwsza klasa

In [9]:
class Game(object):
    def __init__(self, name):
        self.name = name
    def print_name(self):
        print self.name
gra1 = Game('nazwa1')
gra1.print_name()


nazwa1
Dziedziczenie: kolejność szukania atrybutów: szuka w obiekcie, następnie we wszystkich klasach powyżej niego, od lewej do prawej w przypadku dziedziczenia wilokrotnego.

In [8]:
class Game(object):
    def __init__(self, name):
        self.name = name
    def print_name(self):
        print self.name

class Planszowki(Game):
    def __init__(self, name, liczba_graczy):
        self.name = name
        self.liczba_graczy = liczba_graczy
    def print_name(self):
        print self.name + ' dla ' + str(self.liczba_graczy)

gra2 = Game('nazwa2')
gra3 = Planszowki('nazwa3', 2)
gra2.print_name()
gra3.print_name()


nazwa2
nazwa3 dla 2

Wielodziedziczenie - kolejność


In [7]:
class Game(object):
    def __init__(self, name):
        self.name = name
    def print_name(self):
        print self.name

class Talia(object):
    def potasuj(self):
        print 'potasowane'
    def print_name(self):
        print 'karcianka: '+ self.name

class Karcianki(Game, Talia):
    def __init__(self, name, liczba_talii):
        self.name = name
        self.liczba_talii = liczba_talii

class Karcianki2(Talia, Game):
    def __init__(self, name, liczba_talii):
        self.name = name
        self.liczba_talii = liczba_talii
        
gra1 = Karcianki('karcianka', 2)
gra2 = Karcianki2('karcianka', 2)
gra1.print_name()
gra1.potasuj()
gra2.print_name()
gra2.potasuj()


karcianka
potasowane
karcianka: karcianka
potasowane

super a wywołanie metody konkretnej klasy

super

In [6]:
class Game(object):
    def zagraj(self):
        print 'pograne'

class Talia(Game):
    def zagraj(self):
        print 'potasowane'
        super(Talia, self).zagraj()

class Karcianka(Game):
    def zagraj(self):
        print 'rozdane'
        super(Karcianka, self).zagraj()

class Munchkin(Talia, Karcianka):
    def zagraj(self):
        print 'Munchkin'
        super(Munchkin, self).zagraj()
gra1 = Munchkin()
gra1.zagraj()


Munchkin
potasowane
rozdane
pograne
metoda klasy

In [5]:
class Game(object):
    def zagraj(self):
        print 'pograne'

class Talia(Game):
    def zagraj(self):
        print 'potasowane'
        Game.zagraj(self)

class Karcianka(Game):
    def zagraj(self):
        print 'rozdane'
        Game.zagraj(self)

class Munchkin(Talia, Karcianka):
    def zagraj(self):
        print 'Munchkin'
        Talia.zagraj(self)
        Karcianka.zagraj(self)
gra1 = Munchkin()
gra1.zagraj()


Munchkin
potasowane
pograne
rozdane
pograne
Dziedziczenie z object class Game(object): #new style pass class Game: #old style pass Python 3 only has new-style classes. No matter if you subclass from object or not, classes are new-style in Python 3. It is however recommended that you still subclass from object. Important behavior changes between old and new style classes: super added MRO changed descriptors added new style class objects cannot be raised unless derived from Exception __slots__ added

@staticmethod and @classmethod

classmethod must have a reference to a class object as the first parameter, whereas staticmethod can have no parameters at all.

In [4]:
class Date(object):

    def __init__(self, day=0, month=0, year=0):
        self.day = day
        self.month = month
        self.year = year
        print 'success: ', year, month, day

    @classmethod
    def from_string(cls, date_as_string):
        day, month, year = map(int, date_as_string.split('-'))
        date1 = cls(day, month, year)
        return date1

    @staticmethod
    def is_date_valid(date_as_string):
        day, month, year = map(int, date_as_string.split('-'))
        return day <= 31 and month <= 12 and year <= 3999


is_date = Date.is_date_valid('11-09-2012')

date2 = Date.from_string('11-09-2012')

print is_date


success:  2012 9 11
True

ochrona przed zmianami


In [3]:
class Game(object):
    def __init__(self, name):
        self.name = name
    def print_name(self):
        return self.name
    def zagraj(self):
        print 'pograne w ' + self.__print_name()
    def zagraj2(self):
        print 'pograne w ' + self.print_name()
    __print_name = print_name

class Planszowki(Game):
    def __init__(self, name, liczba_graczy):
        self.name = name
        self.liczba_graczy = liczba_graczy
    def print_name(self):
        return self.name + ' dla ' + str(self.liczba_graczy)

gra1 = Planszowki('gra1', 2)
gra1.zagraj()
gra1.zagraj2()


pograne w gra1
pograne w gra1 dla 2
Napisz klasę Człowiek. Każdy człowiek ma nadawane imię i rok urodzenia. Każdy człowiek umie się przedstawić, tzn. Wyświetlić swoje imię oraz podać swój wiek (wyliczony na podstawie roku urodzenia i aktualnej daty) Ludzi możemy podzielić na kobiety i mężczyzn. Kobiety podczas podawania swojego wieku odejmują sobie 2 lata. Mężczyźni natomiast mają problem z liczeniem i za każdym razem mylą się o +/- 3 lata (losowo). Napisz klasę rodzic. Każdy rodzic ma nadawany stopień odpowiedzialności od 0-5. Gdy podczas tworzenia obiektu rodzic nie podamy odpowiedzialności nadawana jest wartość 2. Rodzic podany o odpowiedzialność odpowiada zgodnie z prawdą. Każda matka jest zarówno kobietą jak i rodzicem. Przedstawia się mówiąc „Jestem /imię/ i jestem mamą”. Pytana o wiek odpowiada ile lat ma jej dziecko, które urodziła w wieku 20 lat (wykorzystaj funkcję z klasy człowiek do obliczania wieku, a nie z klasy kobieta!), jeżeli nie ma 20 lat odpowiada jak kobieta. Każdy ojciec jest zarówno mężczyzną jak i rodzicem. Pytany o odpowiedzialność zawyża ją o 1 (nawet jeżeli wychodzi poza skalę!).

In [ ]:
matka1 = Matka('Anna', 1989, 2)
matka2 = Matka('Julia', 2000, 1)
ojciec1 = Ojciec('Radek', 1989)
ojciec2 = Ojciec('Mateusz', 1989, 5)
kobieta1 = Kobieta('Anita', 1989)
czlowiek1 = Czlowiek('Gender', 1989)
matka1.podaj_wiek()
matka2.podaj_wiek()
ojciec1.podaj_wiek()
ojciec2.podaj_wiek()
kobieta1.podaj_wiek()
czlowiek1.podaj_wiek()
ojciec1.podaj_odpowiedzialnosc()
ojciec2.podaj_odpowiedzialnosc()
matka1.podaj_odpowiedzialnosc()
matka1.podaj_imie()
kobieta1.podaj_imie()