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() |
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() |
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() |
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) |
<__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) |
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) |
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() |







