10 Programowanie Obiektowe II

Metoda __init__
Zwana konstruktorem, wywoływana podczas tworzenia obiektu.


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
class Noga:
    def __init__(self, ktora):
        self.ktora=ktora
    def pokaz(self):
        print(self.ktora)


x=Noga("prawa")
y=Noga("lewa")

x.pokaz()
y.pokaz()
Wynik:

prawa
lewa

Jak widać dzięki metodzie __init__ możemy przekazać parametr, już podczas tworzenia obiektu.



Dodawanie atrybutu z zewnątrz klasy:

1
2
x.kolor="Czerwona"
y.kolor="Biała"


Jednak teraz polecenie x.pokaz() dalej wyświetla tylko "prawa".

Teoretycznie wystarczy zmienić metodę pokaz i dodać w niej wyświetlanie atrybutu koloru:

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class Noga:
    def __init__(self, ktora):
        self.ktora=ktora
    def pokaz(self):
        print(self.kolor+ " " +self.ktora)    


x=Noga("prawa")    #tworzymy obiekty
y=Noga("lewa")

x.kolor="Czerwona"     #dodajemy atrybut koloru
y.kolor="Biała"

x.pokaz()
y.pokaz()
wynik:
Czerwona prawa
Biała lewa

...czyli działa, jednak wystarczy że stworzymy kolejny obiekt np
z=Noga("środkowa") i nie dodamy mu atrybutu koloru...podczas uruchomienia metody pokaż dostaniemy błąd informujący o braku atrybutu kolor w obiekcie z.

Problem możemy rozwiązać, sprawdzając w słowniku obiektu __dict__ czy istnieje w nim określenie "kolor". Jeśli istnieje, znaczy, że ktoś dodał atrybut i można go wyprintować.
Jeśli nie, pokażemy tylko self.ktora.

Teraz metoda pokaz wygląda tak:

1
2
3
4
def pokaz(self):
        if "kolor" in self.__dict__:
            print(self.kolor,end=" ")
        print(self.ktora)

a przykład całego kodu z obiektem z, który nie ma dodanego atrybutu koloru:

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
class Noga:
    def __init__(self, ktora):
        self.ktora=ktora
    def pokaz(self):
        if "kolor" in self.__dict__:
            print(self.kolor,end=" ")
        print(self.ktora)

x=Noga("prawa")
y=Noga("lewa")
z=Noga("Środkowa")

x.kolor="Czerwona"
y.kolor="Biała"

x.pokaz()
y.pokaz()
z.pokaz()
wynik:
Czerwona prawa
Biała lewa
Środkowa




Metoda __str__
Jeśli po stworzeniu obiektu spróbujemy go wyświetlić za pomocą print(x)  a nie uruchomić jego metodę x.pokaz

1
 2
 3
 4
 5
 6
 7
 8
 9
10
class Noga:
    def __init__(self, ktora):
        self.ktora=ktora
    def pokaz(self):
        print(self.ktora)

x=Noga("prawa")
y=Noga("lewa")

print(x)
to jako wynik dostaniemy komunikat:

<__main__.Noga object at 0x02F21E10>


Dzięki metodzie __str__ możemy określić co obiekt ma w takim przypadku zwrócić.

Dopisujemy metodę:
1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
class Noga:
    def __init__(self, ktora):
        self.ktora=ktora
    def pokaz(self):
        print(self.ktora)
    def __str__(self):
        return "obiekt klasy Noga"

x=Noga("prawa")
y=Noga("lewa")

print(x)
wynik:

obiekt klasy Noga





Dokumentowanie:
Klasy i metody można dokumentować tak jak funkcje:

1
 2
 3
 4
 5
 6
 7
 8
 9
10
class Noga:
    "Klasa do opisu nogi"
    def start(self, ktora):
        "Metoda pobierająca rodzaj nogi"
        self.ktora=ktora
    def pokaz(self):
        "Metoda pokazjuąca która noga"
        print(self.ktora)

help(Noga)
wynik:

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
Help on class Noga in module __main__:

class Noga(builtins.object)
 |  Klasa do opisu nogi
 |  
 |  Methods defined here:
 |  
 |  pokaz(self)
 |      Metoda pokazjuąca która noga
 |  
 |  start(self, ktora)
 |      Metoda pobierająca rodzaj nogi
 |  





Moduły:
Klasy umieszczone w modułach warto wyposażyć w kod testujący który będzie uruchamiany tylko przy samodzielnym uruchomieniu konkretnego moduły.  Po imporcie modułu mamy dostęp tylko do klas, ale jeśli samodzielnie uruchomimy moduł to uruchomi się main().

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Noga:
    "Klasa do opisu ręki"
    def __init__(self, ktora):
        self.ktora=ktora
    def pokaz(self):
        if "kolor" in self.__dict__:
            print(self.kolor,end=" ")
        print(self.ktora)

def main():
    x=Noga("prawa")
    y=Noga("lewa")
    z=Noga("Środkowa")

    x.kolor="Czerwona"
    y.kolor="Biała"

    x.pokaz()
    y.pokaz()
    z.pokaz()

if __name__ == "__main__" :
    main()