Spis treści[Ukryć][Pokazać]
Na tym wykładzie dowiemy się o klasach, konstruktorach i dziedziczeniu w Pythonie.
Te pojęcia są naprawdę ważne w dużym programie, w którym należy zdefiniować różne typy.
Zajęcia
Klasy są niezbędne w programowaniu i nie są specyficzne dla Pythona. Wiele innych języki programowania wspierać pojęcie klas. Używamy klas do definiowania nowych typów danych.
Do tej pory poznaliśmy podstawowe typy danych w Pythonie, takie jak liczby, łańcuchy i wartości logiczne. Są to podstawowe lub proste typy danych w Pythonie. Widzieliśmy również kilka złożonych typów danych, takich jak listy i słowniki.
Chociaż te typy są niezwykle przydatne, nie zawsze można ich używać do modelowania złożonych koncepcji. Na przykład pomyśl o idei punktu lub koszyka na zakupy. Koszyk nie jest wartością logiczną ani listą. To inny rodzaj danych. Możemy więc użyć klas do zdefiniowania nowych typów w celu modelowania rzeczywistych pojęć.
Teraz zdefiniujmy nowy typ danych o nazwie punkt. Ten nowy typ będzie miał metody, jak sprawdzaliśmy wcześniej.
Tak to zrobisz:
Zaczynamy od zdefiniowania klasy za pomocą słowa kluczowego „class” i zaraz po tym nadajemy naszej klasie nazwę.
class Point
Teraz spójrz na konwencję nazewnictwa, której tu użyłem. Zapisałem tutaj pierwszą literę wielką literą, nazywamy to konwencją nazewnictwa pascala. Ta konwencja różni się od tej, której używamy do nazywania naszych zmiennych i funkcji, dla których zawsze używamy małych liter i oddzielamy wiele słów za pomocą podkreślenia. Ale kiedy nazywamy klasy, nie używamy podkreślenia do oddzielenia wielu słów, zamiast tego używamy wielkiej litery w każdym słowie.
Po zdefiniowaniu naszej klasy używany jest dwukropek, co oznacza, że teraz zdefiniowany jest blok.
class Point:
def move (self):
W tym bloku możemy zdefiniować wszystkie funkcje lub metody, które należą do punktów. Na przykład możemy zdefiniować funkcję o nazwie „przesuń” do przesuwania punktu. Zauważ, że jak tylko wpiszemy open nawias, PyCharm automatycznie doda tutaj „self”. To jest specjalne słowo kluczowe i wkrótce wrócę do tego. Wydrukujmy na terminalu „przenieś”.
print("move")
Zdefiniujmy inną metodę, taką jak „rysuj” i wydrukujmy ją na terminalu.
def draw(self):
print("draw")
Skończyliśmy z definicją naszej klasy „punktowej”. Dzięki temu nowemu typowi możemy tworzyć nowe obiekty. Klasa po prostu definiuje plan lub szablon do tworzenia obiektów, które są rzeczywistymi instancjami opartymi na tym planie. Aby stworzyć obiekt, wpisujemy nazwę naszej klasy, a następnie wywołujemy ją tak samo jak funkcję. Tworzy to nowy obiekt, a następnie zwraca go. Następnie możemy przechowywać ten obiekt w zmiennej. Pokażę ci:
Tutaj zdefiniowaliśmy „punkt1”, który jest punktem trójwymiarowym. Widać, że możemy wydrukować poszczególne współrzędne na terminalu.
W tym punkcie możemy użyć dwóch metod „rysuj” i „przesuń”.
Podsumowując, używamy klas do definiowania nowych typów, a te typy mogą mieć metody, które definiujemy w ciele klasy. Klasy mogą mieć atrybuty, które możemy ustawić w dowolnym miejscu w naszych programach.
Konstruktorzy
Do tej pory nauczyliśmy się tworzyć nowe typy za pomocą klas. Teraz jest mały problem z tą implementacją. Możemy utworzyć obiekt punktowy bez współrzędnych x lub y za pomocą klas, a to nie jest idealne. Pokażę ci.
Stwórzmy punkt i wypiszmy go zanim ustawimy współrzędną x. Uruchomienie naszego programu powoduje błąd atrybutu taki:
Oznacza to, że obiekt punktowy nie ma atrybutu o nazwie x. Teraz problem polega na tym, że możliwe jest posiadanie obiektu punktowego bez współrzędnych x lub y. To nie ma sensu, ponieważ za każdym razem, gdy mówimy o punkcie, musimy wiedzieć, gdzie ten punkt się znajduje. Aby rozwiązać ten problem, używamy konstruktora. Konstruktor to funkcja, która jest wywoływana w momencie tworzenia obiektu.
Oto jak używamy konstruktora. Najpierw przekażmy wartości współrzędnych x i y w powyższym programie.
point = Point(10, 20)
print(point.x)
Teraz musimy dodać do tej klasy specjalną metodę zwaną konstruktorem. Jego składnia jest następująca:
def __init__(self, x, y):
init
jest skrótem od Initialized i jest to funkcja lub metoda, która jest wywoływana, gdy tworzony jest nowy obiekt punktu. X i y są dodawane zaraz po self
aby dodać dwa dodatkowe parametry.
Następnie powinniśmy zmapować x i y na przekazane wartości, tj. 10 i 20
self.x = x
self.y = y
Używamy self
aby odwołać się do bieżącego obiektu, a następnie ustawiamy atrybut x na argument x przekazany do funkcji „x”. W ten sposób, używając init
metody, możemy zainicjalizować nasze obiekty. Ta metoda jest określana jako konstruktor. Uruchommy nasz program.
Teraz możemy później zmienić współrzędne xiy. Zaktualizujmy współrzędną x:
point = Point(10, 20)
point.x = 11
print(point.x)
Teraz współrzędna x jest aktualizowana do wartości 11.
Ćwiczenie
Oto interesujące ćwiczenie dla Ciebie.
Chcę, abyś zdefiniował nowy typ zwany osobą. Te obiekty „Osoba” powinny mieć „name
” atrybut oraz „talk()
" metoda.
To proste zadanie i nie powinno zająć więcej niż kilka minut.
Rozwiązanie
Zacznij od zdefiniowania klasy „Osoba” w ten sposób:
class Person:
self.name = name
Konstruktor zdefiniujemy później. Teraz możemy stworzyć obiekt „Osoba”. Nazwijmy to John
john = Person("John Smith")
print(john.name)
john.talk()
Teraz przejdź do pierwszej części kodu i utwórz konstruktor.
def __init__(self, name):
Ostateczny kod będzie wyglądał tak:
Możesz także używać sformatowanych ciągów i innych pojęć w połączeniu z klasami i konstruktorami.
Dziedzictwo
Dziedziczenie to kolejna koncepcja związana z klasami, która umożliwia ponowne użycie kodu.
Rozważ ten fragment kodu.
class Dog:
def walk(self):
print("walk")
Stworzyliśmy klasę „Pies” metodą „spacer”. W tej metodzie po prostu drukujemy wiadomość spaceru na terminalu. Powiedzmy, że w prawdziwym programie jest 10 wierszy kodu zamiast tylko jednego wiersza. W przyszłości, jeśli potrzebna będzie kolejna klasa, aby mieć metodę „walk”, będziemy musieli powtórzyć cały ten kod. To nie jest idealne.
W programowaniu mamy zasadę zwaną DRY, która jest skrótem od nie powtarzaj się. Powiedzmy, że kiedyś w przyszłości odkryjemy problem z naszą metodą „spaceru” i jeśli powtórzyliśmy lub zduplikowaliśmy tę metodę w wielu innych miejscach, będziemy musieli wrócić i naprawić ten problem w każdym miejscu, w którym to zduplikowaliśmy kod. Dlatego w programowaniu nie powinniśmy definiować czegoś dwa razy.
Istnieją różne podejścia do rozwiązania tego problemu, ale tutaj nauczymy się tego, które jest łatwiejsze dla początkujących i nazywa się dziedziczeniem. W tym przypadku utworzymy kolejną klasę „ssak” i zdefiniujemy nasz atrybut „spacer” w tej klasie.
class Mammal:
def walk(self):
print("walk")
Po zdefiniowaniu naszej klasy „Mammal” możemy użyć dziedziczenia, aby przekazać atrybuty w ten sposób:
Zarówno klasy psów, jak i kotów dziedziczą wszystkie metody klasowe zdefiniowane w ich klasie nadrzędnej. Teraz możemy dodać metody specyficzne dla psów, takie jak:
class Dog:
def bark(self):
print("bark")
Zakończyć!
Chodziło o klasy, konstruktory i ponowne wykorzystanie kodu w klasach z koncepcjami dziedziczenia. Teraz zbliżamy się do końca naszej serii. W tym momencie powinieneś być w stanie tworzyć dobre, czytelne i zwięzłe kody w Pythonie.
Koncepcję modułów i pakietów zobaczymy w następnym wykładzie.
Dodaj komentarz