Programowanie obiektowe w Pythonie: Klasy, opis i funkcje

Klasy Python są podstawowym pojęciem. Jest podstawą standardowej biblioteki, pracy najpopularniejszych programów i samego języka. Jeśli chcesz stać się czymś więcej niż tylko początkującym programistą, musisz zrozumieć istotę i zasadę pracy z klasami i obiektami.

Jakie są klasy

Jest to podstawowy element programu OWP. W Pythonie klasy służą do implementacji nowych typów obiektów i są tworzone przy użyciu specjalnej klasy instrukcji. Zewnętrznie przypominają typowe osadzone typy danych, takie jak liczby lub sekwencje. Ale w obiektach klasy istnieje znaczna różnica - utrzymanie dziedzictwa.


Programowanie obiektowe w języku Python jest całkowicie oparte na hierarchicznym dziedziczeniu klas. Jest to uniwersalny sposób dostosowywania i ponownego użycia kodu. Ale podejście obiektowe nie jest obowiązkowe. Python nie ma problemu, pozwalając tylko na programowanie proceduralne i funkcjonalne. Głównym zadaniem klas w Pythonie jest pakiet danych i kod wykonywalny. Są one syntaktycznie podobne do stwierdzenia def. Podobnie jak funkcje, tworzą swoje przestrzenie nazw, które można wielokrotnie wywoływać z dowolnej części programu. Dlaczego więc ich potrzebują? Klasy są potężniejszym i wszechstronnym narzędziem. Większość ich potencjału ujawnia się w momencie tworzenia nowych obiektów.

Znaczenie klas i zasada dziedziczenia

Każdy obiekt ma swoją własną przestrzeń nazw, którą można zaprogramować, wprowadzić zmienne itworzyć dowolne funkcje. Istnieją również atrybuty dziedziczone z klasy object.attribute. Takie jest znaczenie OOP.


Dzięki dziedziczeniu powstaje drzewo hierarchii. W praktyce jest to następujące. Kiedy interpreter spełnia wyrażenie object.attribute, zaczyna szukać pierwszego wystąpienia atrybutu w określonej klasie. Bez atrybutu interpreter kontynuuje wyszukiwanie we wszystkich powiązanych klasach, które znajdują się w drzewie powyżej, w kierunku od lewej do prawej. Drzewo wyszukiwania zawiera:
  • nadklasy, które znajdują się w górnej części hierarchii i implementują ogólne zachowanie;
  • podklasy - są poniżej;
  • kopie - elementy programu o odziedziczonym zachowaniu.
  • Rysunek pokazuje drzewo klas Pythona. Przykład pokazuje, że klasy 2 i 3 są nadklasami. Na dole są dwie kopie Instance 1 i 2 w środku - Klasa Klasa 1. Jeśli piszesz wyrażenie Instance2.w, sprawi, że wygląd interpretera .w wartość atrybutu w następujący sposób:
  • Instance2;
  • klasa 1;
  • klasa 2;
  • Klasa3. Nazwa
  • .w znajdzie się w nadklasie klasy 3. W terminologii OOP oznacza to, że instancja 2 "dziedziczy" atrybut .w klasy Class3. Należy pamiętać, że kopie obrazu dziedziczyć tylko cztery atrybuty: .w, .x, .y .z:
  • znajduje się kopie Instance1.x i atrybut Instance2.x .x Class 1, gdzie poszukiwanie zatrzymuje jako klasy 1 drzewo jest niższa niż klasa 2.
  • W przypadku Instance1.y i atrybut Instance2.y znajduje .y Class 1, gdzie poszukiwanie zatrzyma się, ponieważ jest to jedyne miejsce, gdzie się pojawi.
  • W przypadku wystąpienia Instance1.z i Instance2.z, tłumacz znajdzie .z Class 2ponieważ znajduje się w drzewie po lewej stronie niż Class3.
  • W Instance2 atrybut name .name zostanie znaleziony w Instance2 bez szukania drzewa.
  • Przedostatnia kwestia jest najważniejsza. Pokazuje, jak klasa 1 redefiniuje atrybut .x, zastępując wersję x klasy superklasy 2.

    Obiekty, instancje i metody

    .OOP działa z dwoma głównymi pojęciami: klasami i obiektami. Klasy tworzą nowe typy, a obiekty klas w Pythonie są ich instancjami. Na przykład wszystkie zmienne całkowite należą do typu danych Int. Data. W języku OOP są to instancje klasy int. Klasy są tworzone przez instrukcje i obiekty przez wywoływanie. Mogą przechowywać dane i mieć własną funkcję lub metody klasy. Terminologia odgrywa ważną rolę w Pythonie. Z jego pomocą programiści rozróżniają funkcje niezależne od tych należących do klas. Zmienne, które odnoszą się do obiektów, są nazywane polami. W OWP istnieją dwa rodzaje pól. Pierwszy to zmienne należące do całej klasy, drugi to zmienne poszczególnych instancji. Pola i metody razem są atrybutami klasy. W języku Python są one napisane w bloku kodu po klasie słów kluczowych.

    Metody i wartości self

    Metody są funkcjami z dodatkowym własnym nazwiskiem. Zostanie dodany na początku listy opcji. Jeśli chcesz, aby zmienna mogła być nazwana inną nazwą, ale taka inicjatywa wśród programistów nie jest mile widziana. Self jest standardem, łatwo rozpoznawalnym w nazwie kodu. Co więcej, niektóre środowiska programistyczne zostały zaprojektowane do współpracy z nim. Aby lepiej zrozumieć znaczenie siebie w OOP, wyobraźmy sobie, że mamy klasę o nazwie ClassA i methodA:
  • class ClassA;
  • def methodA (self, argument 1 argument2).
  • Obiekt objectA jest instancją klasy A, a wywołanie metody wygląda następująco:
  • objectA.methodA (argument argument1).
  • Kiedy tłumacz widzi ten krok, automatycznie konwertuje następująco: ClassA.methodA (objectA, argument1 argument2). Oznacza to, że instancja klasy używa zmiennej własnej jako odniesienia do niej samej.

    Jak tworzyć zmienne, metody i wystąpienia klas

    Proponujemy zdemontować praktyczny przykład z powłoki interaktywnej Pythona. Tworzenie eksperymentu Pierwsza klasa zaczyna się od klasy instrukcji składowej:
  • klasa Najpierw eksperyment:
  • def setinf (self, value): # tworzymy najpierw metodę z argumentami
  • self.data = value
  • ]
  • wyświetlacz def (self): druga metoda
  • print (self.data) # wydrukuj kopię danych.
  • Po obowiązkowym odwrocie znajduje się blok z dołączoną instrukcją def, w której obiektom obiektowym przypisywane są nazwy setinf i display. Z ich pomocą tworzone są atrybuty ExperimentPrivy.setinf i ExperimentPrivy.display. W rzeczywistości każda nazwa przypisująca wartość najwyższemu poziomowi w zagnieżdżonym bloku staje się atrybutem. Aby zobaczyć, jak działają te metody, musisz utworzyć dwie instancje:
  • x = Pierwszy eksperyment () # Tworzone są dwie kopie;
  • y = ExperimentPerfect () # Każdy jest oddzielną przestrzenią nazw.
  • Początkowo okazy nie przechowują żadnych informacji i są całkowicie puste. Ale są one związane z ich klasą:
  • x.setinf ("Naucz Pythona") # Wywołaj metodę, w której self-x.
  • y.setinf (314) # Równoważny: najpierw eksperyment .setinf (y, 314)
  • Jeśli używasz nazwy instancjix, y odwołuje się do atrybutu obiektu .setinf klasy klasy Experiment, a następnie interpreter zwraca wartość atrybutu class w wyniku wyszukiwania drzewa dziedziczenia.
  • x.display () # Wx i y twoje wartości self.data
  • Naucz Pythona
  • y.display ()
  • 314.
  • (52 )

    Przeciążanie operatorów

    W języku Python klasy mogą przeciążyć operatory instrukcji. Ta opcja powoduje, że kopie są podobne do wbudowanych typów danych. Proces polega na implementacji metod o specjalnych nazwach, które zaczynają się i kończą podwójnym podkreśleniem. Zastanów się w akcji __init__ i __sub__. Pierwsza metoda nazywa się konstruktorem klasy. W języku Python __init__ wykonuje operację tworzenia kopii przeciążeniowej. Druga metoda __sub__ realizuje operację odejmowania.
  • grupa przeciążeniowe # tworzenie nowej klasy
  • def __init __ (samo rozpocząć)
  • ,
  • self.data = start
  • def __sub __ (siebie i inne): # minus druga kopia
  • przeciążeniem zwrotny (self.data - inne) # wynik będzie nowy przypadek
  • A = przeciążeniowe

    #__ startowych __ (A 10),

  • B = A - 2 #__ sub __ (B, 2),
  • # B B. dane - nowy przykład przeciążenia
  • 8.
  • szczegóły metody z __init__

    Sposób __init__ najczęściej używany podczas pracy z zajęciami. Jest niezbędny do inicjowania różnych obiektów. __init__ Zadzwoń osobno. Podczas tworzenia nowego sposobu wystąpienia automatycznie odbiera argumenty podane w nawiasach. W przypadku metod przeciążania można implementować dowolne operacje z osadzonymi typami danych. Większość jest używana tylko podczas rozwiązywania zadań specjalnych, w których jest to konieczne dla obiektówsymulował zachowanie standardowych obiektów. Metody są dziedziczone z nadklas i nie są obowiązkowe. Na początkowych etapach bez nich łatwo się obejść. Ale dla pełnego zanurzenia w naturze programowania i OOP wymaga znajomości pracy operatorów.

    Metoda __getitem__

    Sposób ten prowadzi do przeciążenia __getitem__ elementu dostępu indeksu. Jeśli jest dziedziczona lub występuje w definicji klasy, a następnie indeksowane każdy interpreter transakcja wezwie go automatycznie. Na przykład, jeśli pojawi się kopię F w elemencie ekstrakcja ekspresyjnej wskaźnik, taki jak F [I] Python interpreter __getitem__ sposób, przedmiot F przechodzi przez pierwszy argument indeksu wskazane w nawiasach w drugiej. Kolejna klasa "PrymerYndeksatsyy" zwraca kwadrat indeksu:
  • klasy PrymerYndeksatsyy
  • def __getitem __ (samo, index):
  • wskaźnika zysk ** 2
  • F = PrymerYndeksatsyy ()
  • ,
  • M
  • # ekspresji F [i] M .__ GetItem __ (i) ,
  • 4
  • do i w zakresie
  • print (F [i], koniec = «») # to __getitem __ (F, i) w każdej iteracji
  • 014 916
  • Dzięki tej metodzie, można wykonać operację wydobycia cięcia, który jest często używany podczas pracy z sekwencjami. Podczas przetwarzania listy standardowych operacji składni jest następujący:
  • Lista = [13, 6, "a", "C", 74,9],
  • Lista [2, 4],
  • ,
  • ["A", "C"],
  • Lista [1:],
  • [6, "a", "C", 74,9],
  • Lista [: 1]
  • [13, 6 "a", "c"],
  • Lista [:: 2],
  • [13 "i" 74,9 ],
  • Klasa realizuje __getitem__ metoda:
  • klasy Indexer
  • moy_spysok = [13, 6, "a", "C", 74,9],
  • def __getitem__ (self, index): # Called whenIndeksowanie i ekstrakt plaster
  • druku («GetItem:», wskaźnik)
  • ,
  • self.moy_spysok powrotu [indeks] Wykonuje # ekstraktów indeksowania albo cięcia
  • X = Indexer ()
  • X# podczas indeksowania __getitem__ otrzymuje całkowitą
  • GetItem 0
  • 13
  • X [2, 4] # Po ekstrakcji otrzymuje cięcia __getitem__ przedmiotem cięcia
  • GetItem: plaster (2 kwietnia Brak)
  • ["A", "C"],
  • ,
    ,

    Adres do przypisania

    W związku do wyróżnikiem sposób jest wykorzystywany __getattr__. On wywołany nazwę atrybutu jako ciąg w przypadku prób, aby uzyskać odwołanie do nieistniejącego atrybutu lub niejasne. Gdy interpreter może wykryć żądany obiekt w drzewie dziedziczenia, __getattr __. Nie dzwonił. Sposób nadaje się do ogólnych żądań przetwarzania do cech:
  • klasy Przeminęło:
  • def __getattr __ (self, atname):
  • , jeżeli atname «wieku» ==:
  • zwracają 20
  • , dalej:
  • podnosi AttributeError atname,
  • , D = Przeminęło ()
  • D. wieku
  • 20
  • Nazwa D.
  • AttributeError: nazwa
  • w Przeminęło klasy D, a nie jego kopia ich atrybutów. Dlatego przy wywołaniu do D. wieku metoda __getattr__ jest automatycznie wywoływana. Sama kopia jest przekazywana jako self, a nazwa nieokreślonego "age" w linii nazwa. Klasa zwraca wynik trafienia do nazwy wieku D., mimo że nie ma tego atrybutu. Jeżeli nie przewiduje się atrybutem klasy metoda przetwarzania __getattr__ osadzony jest wyjątek, a więc interpreter przekazuje informację, że nazwa rzeczywiście jest niepewna. W takim przypadku próba odwołania się do nazwy D. prowadzi do błędu. Metoda działa w podobny sposóbPrzeciążanie operatorów __setattr__, przechwytywanie każdej próby przypisania wartości atrybutów. Jeśli ta metoda jest zapisana w treści klasy, wyrażenie "self.attitude = value" zostanie przekonwertowane na wywołanie metody self .__ setattr _ ("attribute", value). Opisaliśmy tylko kilka istniejących metod przeciążania. Cała lista znajduje się w standardowym przewodniku językowym i zawiera wiele innych nazw.

    Dodatkowe funkcje

    OOP są czasami używane do złożonych i niestandardowych zadań. Dzięki dziedziczeniu klas w Pythonie, rozszerzanie i dostosowywanie zachowań wbudowanych typów danych i ich możliwości. Jeśli nie jesteś zadowolony z faktu, że indeksowanie w sekwencjach zaczyna się od zera, możesz to poprawić za pomocą instrukcji klasy. Aby to zrobić, musisz utworzyć podklasę listy typów z nowymi nazwami wszystkich typów i wprowadzić niezbędne zmiany. Również w PLO w języku Python są dekoratory funkcji, metody statyczne i wiele innych skomplikowanych i specjalnych technik.

    Powiązane publikacje