Na tem predavanju bomo spoznali razrede, konstruktorje in dedovanje v pythonu.
Ti koncepti so zelo pomembni v velikem programu, kjer je treba definirati različne vrste.
razredi
Razredi so bistveni pri programiranju in niso specifični za python. Mnogi drugi programskih jezikov podpirajo pojem razredov. Za definiranje novih tipov podatkov uporabljamo razrede.
Doslej smo spoznali osnovne vrste podatkov v Pythonu, kot so števila, nizi in logične vrednosti. To so osnovni ali enostavni tipi podatkov v Pythonu. Videli smo tudi nekaj zapletenih tipov podatkov, kot so seznami in slovarji.
Čeprav so ti tipi izjemno uporabni, jih ni mogoče vedno uporabiti za modeliranje kompleksnih konceptov. Na primer, razmislite o ideji točke ali nakupovalnega vozička. Nakupovalni voziček ni logična vrednost ali seznam. Gre za drugačno vrsto podatkov. Tako lahko uporabimo razrede za definiranje novih tipov za modeliranje resničnih konceptov.
Zdaj pa definirajmo nov podatkovni tip, imenovan točka. Ta nova vrsta bo imela metode, kot smo preverili prej.
Tako boste to storili:
Začnemo z definiranjem razreda s ključno besedo »razred« in takoj za tem našemu razredu damo ime.
class Point
Zdaj pa poglejte konvencijo poimenovanja, ki sem jo uporabil tukaj. Prvo črko sem napisal z veliko začetnico, temu pravimo pascalska konvencija poimenovanja. Ta konvencija se razlikuje od tiste, ki jo uporabljamo za poimenovanje naših spremenljivk in funkcij, za katere vedno uporabljamo male črke in ločimo več besed s podčrtajem. Toda pri poimenovanju razredov ne uporabljamo podčrtaja za ločevanje več besed, ampak prvo črko vsake besede naredimo z veliko.
Po definiranju našega razreda se uporabi dvopičje, kar pomeni, da je zdaj blok definiran.
class Point:
def move (self):
V tem bloku lahko definiramo vse funkcije ali metode, ki pripadajo točkam. Na primer, lahko definiramo funkcijo, imenovano "premakni", za premikanje točke. Upoštevajte, da takoj, ko vnesemo odprti oklepaj, PyCharm sem samodejno doda »self«. To je posebna ključna beseda in naj se k njej kmalu vrnem. Na terminal natisnemo »premakniti«.
print("move")
Določimo še eno metodo, kot je »risanje«, in jo natisnimo na terminalu.
def draw(self):
print("draw")
Končali smo z definicijo našega "točkovnega" razreda. S to novo vrsto lahko ustvarimo nove predmete. Razred preprosto definira načrt ali predlogo za ustvarjanje predmetov, ki so dejanski primerki na podlagi tega načrta. Če želite ustvariti objekt, vtipkamo ime našega razreda in ga nato pokličemo tako kot funkcijo. To ustvari nov objekt in ga nato vrne. Nato lahko ta objekt shranimo v spremenljivko. Naj vam pokažem:
Tukaj smo definirali "točko1", ki je tridimenzionalna točka. To lahko vidite, na terminalu lahko natisnemo posamezne koordinate.
S to točko lahko uporabimo dve metodi "risanje" in "premaknitev".
Če povzamemo, uporabljamo razrede za definiranje novih tipov in ti tipi imajo lahko metode, ki jih definiramo v telesu razreda. Razredi imajo lahko atribute, ki jih lahko nastavimo kjer koli v naših programih.
Konstruktorji
Doslej smo se naučili ustvarjati nove vrste z uporabo razredov. Zdaj je pri tej izvedbi majhen problem. Točkovni objekt lahko ustvarimo brez koordinate x ali y z uporabo razredov in to ni idealno. Naj vam pokažem.
Ustvarimo točko in jo natisnimo, preden nastavimo koordinato x. Zagon našega programa povzroči napako atributa, kot je ta:
To pomeni, da točkovni objekt nima atributa x. Težava je v tem, da je mogoče imeti točkovni objekt brez koordinat x ali y. To nima smisla, saj moramo vedno, ko govorimo o točki, vedeti, kje se ta točka nahaja. Za rešitev tega problema uporabljamo konstruktor. Konstruktor je funkcija, ki se pokliče v času ustvarjanja predmeta.
Takole uporabljamo konstruktor. Najprej posredujmo vrednosti koordinat x in y v zgornjem programu.
point = Point(10, 20)
print(point.x)
Zdaj moramo v ta razred dodati posebno metodo, imenovano konstruktor. Njegova sintaksa je takšna:
def __init__(self, x, y):
init
je okrajšava za inicializirano in to je funkcija ali metoda, ki se pokliče, ko je ustvarjen nov točkovni objekt. X in y sta dodana takoj za tem self
da dodate dva dodatna parametra.
Po tem bi morali preslikati x in y v posredovane vrednosti, tj. 10 in 20
self.x = x
self.y = y
Mi uporabljamo self
da se sklicuje na trenutni objekt, nato pa nastavimo atribut x na argument x, posredovan funkciji "x". Na ta način z uporabo init
metodo, lahko inicializiramo svoje objekte. Ta metoda se imenuje konstruktor. Zaženimo naš program.
Sedaj lahko pozneje spremenimo koordinate x in y. Posodobimo koordinato x:
point = Point(10, 20)
point.x = 11
print(point.x)
Zdaj je koordinata x posodobljena na vrednost 11.
Vaja
Tukaj je zanimiva vaja za vas.
Želim, da definirate nov tip, imenovan oseba. Ti objekti »Oseba« bi morali imeti »name
" kot tudi "talk()
”Metoda.
To je preprosta naloga in ne sme trajati več kot nekaj minut.
Rešitev
Začnite z definiranjem razreda »Oseba« takole:
class Person:
self.name = name
Konstruktor bomo definirali kasneje. Zdaj lahko ustvarimo objekt »Person«. Imenujmo ga John
john = Person("John Smith")
print(john.name)
john.talk()
Zdaj pa pojdite na prvi del kode in ustvarite konstruktor.
def __init__(self, name):
Končna koda bo videti takole:
Uporabite lahko tudi oblikovane nize in druge koncepte v povezavi z razredi in konstruktorji.
Dedovanje
Dedovanje je še en koncept, povezan z razredi, ki vam omogočajo ponovno uporabo kode.
Razmislite o tem delu kode.
class Dog:
def walk(self):
print("walk")
Ustvarili smo razred "Pes" z metodo "sprehod". Pri tej metodi preprosto natisnemo sporočilo o hoji na terminalu. Recimo, da je v pravem programu 10 vrstic kode namesto samo ene vrstice tukaj. Če bo v prihodnosti potreben še en razred za metodo »sprehoda«, bomo morali ponoviti vso to kodo. To ni idealno.
V programiranju imamo načelo, imenovano DRY, kar je okrajšava za ne ponavljaj se. Recimo, da bomo nekoč v prihodnosti odkrili težavo z našo metodo »sprehoda« in če smo to metodo ponovili ali podvojili na mnogih drugih mestih, se bomo morali vrniti in popraviti to težavo na vsakem posameznem mestu, kjer smo to podvojili Koda. Zato pri programiranju nečesa ne bi smeli definirati dvakrat.
Obstajajo različni pristopi za odpravo te težave, a tukaj se bomo naučili tistega, ki je lažji za začetnike in se imenuje dedovanje. V tem primeru bomo ustvarili še en razred »sesalec« in v tem razredu definirali naš atribut »hod«.
class Mammal:
def walk(self):
print("walk")
Ko definiramo naš razred »Sesalec«, lahko uporabimo dedovanje za posredovanje atributov, kot je ta:
Razreda psa in mačke podedujeta vse metode razreda, definirane v njunem nadrejenem razredu. Zdaj lahko dodamo metode, specifične za pse, kot je ta:
class Dog:
def bark(self):
print("bark")
Zaviti!
To je bilo vse o razredih, konstruktorjih in ponovni uporabi kode v razredih s koncepti dedovanja. Zdaj se bližamo koncu naše serije. Do te točke bi morali biti sposobni ustvariti dobre, berljive in jedrnate kode v Pythonu.
Koncept modulov in paketov si bomo ogledali na naslednjem predavanju.
Pustite Odgovori