Innholdsfortegnelse[Gjemme seg][Forestilling]
I dette foredraget skal vi lære om klasser, konstruktører og arv i python.
Disse konseptene er veldig viktige i et stort program der ulike typer må defineres.
Klasser
Klasser er viktige i programmering, og de er ikke spesifikke for python. Mange andre programmerings språk støtte forestillingen om klasser. Vi bruker klasser for å definere nye datatyper.
Så langt har vi lært om de grunnleggende datatypene i Python som tall, strenger og booleaner. Dette er de grunnleggende eller enkle datatypene i Python. Vi har også sett et par komplekse datatyper som lister og ordbøker.
Selv om disse typene er ekstremt nyttige, kan de ikke alltid brukes til å modellere komplekse konsepter. Tenk for eksempel på ideen om et punkt eller en handlekurv. En handlekurv er ikke en boolsk eller en liste. Det er en annen type data. Så vi kan bruke klasser til å definere nye typer for å modellere virkelige konsepter.
La oss nå definere en ny datatype kalt punkt. Denne nye typen kommer til å ha metoder som vi sjekket før.
Slik vil du gjøre det:
Vi starter med å definere en klasse ved å bruke nøkkelordet "klasse", og rett etter det gir vi klassen et navn.
class Point
Se nå på navnekonvensjonen jeg har brukt her. Jeg har satt den første bokstaven med stor bokstav her, dette er det vi kaller en pascal navnekonvensjon. Denne konvensjonen er forskjellig fra den vi bruker for å navngi variablene og funksjonene våre, som vi alltid bruker små bokstaver for og skiller flere ord ved å bruke et understrek. Men når vi navngir klasser, bruker vi ikke understrek for å skille flere ord i stedet, vi bruker stor bokstav i hvert ord.
Etter å ha definert klassen vår, brukes et kolon som betyr at nå er en blokk definert.
class Point:
def move (self):
I denne blokken kan vi definere alle funksjonene eller metodene som hører til punkter. For eksempel kan vi definere en funksjon kalt "flytte" for å flytte et punkt. Merk at så snart vi skriver åpen parentes, legger PyCharm automatisk til "selv" her. Dette er et spesielt nøkkelord, og la meg komme tilbake til dette snart. La oss skrive "move" på terminalen.
print("move")
La oss definere en annen metode som "tegne" og skrive den ut på terminalen.
def draw(self):
print("draw")
Vi er ferdige med definisjonen av "punkt"-klassen vår. Med denne nye typen kan vi lage nye objekter. En klasse definerer ganske enkelt blåkopien eller malen for å lage objekter som er de faktiske forekomstene basert på den blåkopien. For å lage et objekt, skriver vi ut navnet på klassen vår og kaller det deretter akkurat som en funksjon. Dette oppretter et nytt objekt og returnerer det. Da kan vi lagre det objektet i en variabel. La meg vise deg:
Her har vi definert et "punkt1" som er et tredimensjonalt punkt. Du kan se det, vi kan skrive ut individuelle koordinater på terminalen.
Vi kan bruke de to metodene "tegne" og "flytte" med dette punktet.
Så for å oppsummere bruker vi klasser for å definere nye typer, og disse typene kan ha metoder som vi definerer i klassens kropp. Klasser kan ha attributter som vi kan angi hvor som helst i programmene våre.
Konstruktører
Så langt har vi lært å lage nye typer ved hjelp av klasser. Nå er det et lite problem med denne implementeringen. Vi kan lage et punktobjekt uten en x- eller y-koordinat ved å bruke klasser, og det er ikke ideelt. La meg vise deg.
La oss lage et punkt og skrive det ut før vi setter x-koordinaten. Å kjøre programmet vårt resulterer i en attributtfeil som dette:
Det betyr at punktobjektet ikke har noen attributt kalt x. Nå er problemet at det er mulig å ha et punktobjekt uten x- eller y-koordinater. Dette gir ikke mening, for når vi snakker om et punkt, må vi vite hvor det punktet befinner seg. For å løse dette problemet bruker vi en konstruktør. En konstruktør er en funksjon som blir kalt når du oppretter et objekt.
Her er hvordan vi bruker en konstruktør. Først, la oss sende x- og y-koordinatverdiene i programmet ovenfor.
point = Point(10, 20)
print(point.x)
Nå må vi legge til en spesiell metode i denne klassen kalt en konstruktør. Syntaksen er slik:
def __init__(self, x, y):
init
er en forkortelse for initialized, og dette er funksjonen eller metoden som blir kalt når et nytt punktobjekt opprettes. X og y legges til rett etter self
for å legge til to ekstra parametere.
Etter det skal vi kartlegge x og y til de beståtte verdiene, dvs. 10 og 20
self.x = x
self.y = y
Vi bruker self
for å referere til det gjeldende objektet, og så setter vi x-attributtet til x-argumentet som sendes til funksjonen "x". På denne måten bruker init
metode, kan vi initialisere objektene våre. Denne metoden blir referert til som en konstruktør. La oss kjøre programmet vårt.
Nå kan vi endre x- og y-koordinatene senere. La oss oppdatere x-koordinaten:
point = Point(10, 20)
point.x = 11
print(point.x)
Nå er x-koordinaten oppdatert til verdi 11.
Øvelse
Her er en interessant øvelse for deg.
Jeg vil at du skal definere en ny type som kalles en person. Disse "Person"-objektene skal ha en "name
"-attributt samt en "talk()
”Metoden.
Det er en enkel oppgave og bør ikke ta mer enn et par minutter.
Oppløsning
Begynn med å definere klassen "Person" slik:
class Person:
self.name = name
Vi vil definere konstruktøren senere. Nå kan vi lage "Person"-objektet. La oss kalle det John
john = Person("John Smith")
print(john.name)
john.talk()
Gå nå videre til den første delen av koden og lag en konstruktør.
def __init__(self, name):
Den endelige koden vil se slik ut:
Du kan også bruke formaterte strenger og andre konsepter i forbindelse med klasser og konstruktører.
Arv
Arv er et annet konsept knyttet til klasser som lar deg gjenbruke en kode.
Tenk på denne kodebiten.
class Dog:
def walk(self):
print("walk")
Vi har laget en klasse "Hund" med en "gå" metode. I denne metoden skriver vi ganske enkelt ut gangmeldingen på terminalen. La oss si at i et ekte program er det 10 linjer med kode i stedet for bare én linje her. I fremtiden, hvis en annen klasse er nødvendig for å ha "walk"-metoden, må vi gjenta all den koden. Dette er ikke ideelt.
I programmering har vi et prinsipp kalt DRY som er forkortelse for ikke gjenta deg selv. La oss si at vi en gang i fremtiden oppdager et problem med "gå"-metoden vår, og hvis vi har gjentatt eller duplisert denne metoden mange andre steder, må vi komme tilbake og fikse problemet på hvert eneste sted vi har duplisert dette kode. Så derfor bør vi i programmering ikke definere noe to ganger.
Det er forskjellige tilnærminger for å løse dette problemet, men her skal vi lære den som er lettere for nybegynnere, og den kalles arv. I dette tilfellet vil vi opprette en annen klasse "pattedyr" og definere vår "gå"-attributt i den klassen.
class Mammal:
def walk(self):
print("walk")
Etter å ha definert "Pattedyr"-klassen vår kan vi bruke arv til å overføre attributtene slik:
Både hunde- og katteklassene arver alle klassemetodene som er definert i foreldreklassen. Nå kan vi legge til metoder som er spesifikke for hunder som dette:
class Dog:
def bark(self):
print("bark")
Pakk opp!
Dette handlet om klassene, konstruktørene og gjenbruk av koden i klasser med arvekonsepter. Nå nærmer vi oss slutten av serien vår. På dette tidspunktet skal du være i stand til å produsere gode, lesbare og konsise koder i Python.
Vi vil se konseptet med moduler og pakker i neste forelesning.
Legg igjen en kommentar