blog.furas.pl
# prywatne notatki - Python, Linux, Machine Learning, etc.

Próba wyjaśnienia co to jest klasa, obiekt, atrybuty w Pythonie

To jest „przedruk” mojej wypowiedzi na polskim forum Pythona.

http://pl.python.org/forum/index.php?topic=3764.msg19009#msg19009


Może trochę przesadze w opisie ale jak przeczytałem o kaczuszkach i samochodzikach to przyszło mi do głowy:

Idź do IKEA, kup taboret do skręcenia a jak w domu go rozpakujesz to znajdziesz tam instrukcje "jak skręcić taboret" i to jest klasa - przepis na taboret. Bardziej od sposobu skręcania taboretu jest tu istotne jak on ma docelowo wyglądać - ile ma mieć nóg, jakie ma mieć wymiary, ile śrubek itd. - i to są jego atrybuty.

class PrzepisNaTaboret(object):
    # atrybuty taboretu
     ilosc_nog = 4
     ilosc_srubek = 100
     dlugosc_nogi = 50
     szerokosc_siedzenia = 50
     glebokosc_siedzenia = 50

Oczywiście sama instrukcja jest mało przydatna bo trudno na niej posadzić gości. Tak więc mając instrukcje należy skręcić kilka taboretów (pomińmy zdobywanie drewna na taborety). I taki fizyczny taboret to będzie już obiekt lub inaczej instancja klasy PrzepisNaTabore (czyli fizyczny przedstawiciel stworzony za pomocą instrukcji PrzepisNaTabore).

Tak więc korzystając z naszej instrukcji skręcamy pierwszy fizyczny taboret

pierwszy_taboret = PrzepisNaTaboret()

Jak wspomniałem wcześniej materiał nie stanowi problemu więc skręcamy więcej taboretów.

drugi_taboret = PrzepisNaTaboret()
trzeci_taboret = PrzepisNaTaboret()

Niestety przy pierwszym taborecie użyliśmy więcej śrubek (105) więc w ostatnim ich nam zabrakło i użyliśmy tylko 95

pierwszy_taboret.ilosc_srubek = 105
trzeci_taboret.ilosc_srubek = 95

Przychodzą goście widzą taborety i chcieli by czegoś się o nich dowiedzieć - jakie mają wymiary, ile śrubek potrzeba do ich skręcenia.

print pierwszy_taboret.ilosc_srubek # 105
print pierwszy_taboret.szerokosc_siedzenia # 50

print drugi_taboret.ilosc_srubek # 100
print drugi_taboret.szerokosc_siedzenia # 50

print trzeci_taboret.ilosc_srubek # 95
print trzeci_taboret.szerokosc_siedzenia # 50

Taborety to jednak niewygodne meble - przydały by się krzesła z oparciem. Aby jednak nie wymyślać wszystkiego od początku, zkserujemy instrukcje taboretu, i tylko dorysowujemy oparcie i nazywiemy to "Przepis Na Krzesło na podstawie Przepisu Na Taboret". W ten sposób krzesło odziedziczyło wszelkie cechy taboretu i dodatkowo dostało oparcie. I tu mamy dziedziczenie klas.

class PrzepisNaKrzeslo(PrzepisNaTaboret):
     posiada_oparcie = 'tak'

Nie trzeba pisać, że krzesło ma 4 nogi i jakie ma wymiary bo to wszystko przejęło (odziedziczyło) od taboretu.

wygodne_kreslo = PrzepisNaKrzeslo()

print wygodne_krzeslo.ilosc_nog # 4
print wygodne_krzeslo.posiada_oparcie # 'tak'

Nie możemy jednak sprawdzić czy taboret ma oparcie bo wcześniej nikt nie pomyślał aby o tym umieścić informacje w jego instrukcji

print pierwszy_taboret.posiada_oparcie # ERROR

Teraz możemy co najwyżej do każdego taboretu z osobna przypisać taką informację

pierwszy_taboret.posiada_oparcie = 'nie'
drugi_taboret.posiada_oparcie = 'nie'
trzeci_taboret.posiada_oparcie = 'nie'


::::python
print pierwszy_taboret.posiada_oparcie # 'nie'

itd.

W ten sposób można by to dalej rozbudowywać ...

Książki: python-dla-kazdego-podstawy-programowania python-wprowadzenie python-leksykon-kieszonkowy python-receptury python-programuj-szybko-i-wydajnie python-projekty-do-wykorzystania black-hat-python-jezyk-python-dla-hackerow-i-pentesterow efektywny-python-59-sposobow-na-lepszy-kod tdd-w-praktyce-niezawodny-kod-w-jezyku-python aplikacje-internetowe-z-django-najlepsze-receptury