Indholdsfortegnelse[Skjule][At vise]
I dette foredrag lærer vi om klasser, konstruktører og arv i python.
Disse begreber er virkelig vigtige i et stort program, hvor forskellige typer skal defineres.
Klasser
Klasser er vigtige i programmering, og de er ikke specifikke for python. Mange andre programmeringssprog støtte begrebet klasser. Vi bruger klasser til at definere nye datatyper.
Indtil videre har vi lært om de grundlæggende datatyper i Python som tal, strenge og booleaner. Disse er de grundlæggende eller simple datatyper i Python. Vi har også set et par komplekse datatyper som lister og ordbøger.
Selvom disse typer er ekstremt nyttige, kan de ikke altid bruges til at modellere komplekse koncepter. Tænk for eksempel på ideen om et punkt eller en indkøbskurv. En indkøbskurv er ikke en boolean eller en liste. Det er en anden slags data. Så vi kan bruge klasser til at definere nye typer til at modellere virkelige koncepter.
Lad os nu definere en ny datatype kaldet punkt. Denne nye type vil have metoder, som vi tjekkede før.
Sådan vil du gøre det:
Vi starter med at definere en klasse ved at bruge søgeordet "klasse", og lige efter giver vi vores klasse et navn.
class Point
Se nu på den navnekonvention, jeg har brugt her. Jeg har skrevet det første bogstav med stort her, det er det, vi kalder en pascal-navngivningskonvention. Denne konvention er forskellig fra den, vi bruger til at navngive vores variabler og funktioner, hvor vi altid bruger små bogstaver og adskiller flere ord ved hjælp af en understregning. Men når vi navngiver klasser, bruger vi ikke en understregning til at adskille flere ord i stedet, vi bruger det første bogstav i hvert ord med stort.
Efter at have defineret vores klasse, bruges et kolon, hvilket betyder, at nu er en blok defineret.
class Point:
def move (self):
I denne blok kan vi definere alle de funktioner eller metoder, der hører til punkter. For eksempel kan vi definere en funktion kaldet "flytte" til at flytte et punkt. Bemærk, at så snart vi skriver åben parentes, tilføjer PyCharm automatisk "selv" her. Dette er et særligt nøgleord, og lad mig vende tilbage til dette kort. Lad os udskrive "move" på terminalen.
print("move")
Lad os definere en anden metode som "tegne" og udskrive den på terminalen.
def draw(self):
print("draw")
Vi er færdige med definitionen af vores "punkt"-klasse. Med denne nye type kan vi skabe nye objekter. En klasse definerer blot blueprintet eller skabelonen til at skabe objekter, som er de faktiske forekomster baseret på den blueprint. For at oprette et objekt, skriver vi navnet på vores klasse og kalder det derefter ligesom en funktion. Dette opretter et nyt objekt og returnerer det derefter. Så kan vi gemme det objekt i en variabel. Lad mig vise dig:
Her har vi defineret et "punkt1", som er et tredimensionelt punkt. Det kan du se, vi kan printe individuelle koordinater på terminalen.
Vi kan bruge de to metoder "tegne" og "bevæge" med dette punkt.
Så for at opsummere bruger vi klasser til at definere nye typer, og disse typer kan have metoder, som vi definerer i klassens krop. Klasser kan have attributter, som vi kan indstille hvor som helst i vores programmer.
Konstruktører
Indtil videre har vi lært, hvordan man opretter nye typer ved hjælp af klasser. Nu er der et lille problem med denne implementering. Vi kan oprette et punktobjekt uden en x- eller y-koordinat ved hjælp af klasser, og det er ikke ideelt. Lad mig vise dig.
Lad os oprette et punkt og udskrive det, før vi sætter x-koordinaten. Kørsel af vores program resulterer i en attributfejl som denne:
Det betyder, at punktobjektet ikke har nogen attribut kaldet x. Nu er problemet, at det er muligt at have et punktobjekt uden x- eller y-koordinater. Dette giver ikke mening, da når vi taler om et punkt, skal vi vide, hvor det punkt er placeret. For at løse dette problem bruger vi en konstruktør. En konstruktør er en funktion, der bliver kaldt på tidspunktet for oprettelse af et objekt.
Her er, hvordan vi bruger en konstruktør. Lad os først sende x- og y-koordinatværdierne i ovenstående program.
point = Point(10, 20)
print(point.x)
Nu skal vi tilføje en speciel metode i denne klasse kaldet en konstruktør. Dens syntaks er sådan her:
def __init__(self, x, y):
init
er en forkortelse for initialized, og det er den funktion eller metode, der bliver kaldt, når et nyt punktobjekt oprettes. X og y tilføjes lige efter self
for at tilføje to ekstra parametre.
Derefter skal vi kortlægge x og y til de beståede værdier, dvs. 10 og 20
self.x = x
self.y = y
Vi bruger self
for at henvise til det aktuelle objekt, og så sætter vi x-attributten til x-argumentet, der sendes til funktionen "x". På denne måde bruger init
metode, kan vi initialisere vores objekter. Denne metode kaldes en konstruktør. Lad os køre vores program.
Nu kan vi ændre x- og y-koordinaterne senere. Lad os opdatere x koordinat:
point = Point(10, 20)
point.x = 11
print(point.x)
Nu er x-koordinaten opdateret til værdi 11.
Dyrke motion
Her er en interessant øvelse til dig.
Jeg vil have dig til at definere en ny type kaldet en person. Disse "Person"-objekter skal have en "name
" attribut samt en "talk()
”Metode.
Det er en simpel opgave og bør ikke tage mere end et par minutter.
Løsning
Start med at definere klassen "Person" sådan her:
class Person:
self.name = name
Vi vil definere konstruktøren senere. Nu kan vi oprette "Person"-objektet. Lad os kalde det John
john = Person("John Smith")
print(john.name)
john.talk()
Gå nu videre til den første del af koden og opret en konstruktør.
def __init__(self, name):
Den endelige kode vil se sådan ud:
Du kan også bruge formaterede strenge og andre koncepter i forbindelse med klasser og konstruktører.
Arv
Arv er et andet koncept forbundet med klasser, der lader dig genbruge en kode.
Overvej dette stykke kode.
class Dog:
def walk(self):
print("walk")
Vi har lavet en klasse "Hund" med en "gå" metode. I denne metode udskriver vi blot gangmeddelelsen på terminalen. Lad os sige, at i et rigtigt program er der 10 linjer kode i stedet for kun en linje her. I fremtiden, hvis en anden klasse er nødvendig for at have "walk"-metoden, bliver vi nødt til at gentage al den kode. Dette er ikke ideelt.
I programmering har vi et princip kaldet DRY, som er en forkortelse for ikke gentag dig selv. Lad os sige engang i fremtiden, at vi opdager et problem med vores "gå"-metode, og hvis vi har gentaget eller duplikeret denne metode mange andre steder, bliver vi nødt til at vende tilbage og løse problemet hvert eneste sted, hvor vi har duplikeret dette. kode. Så derfor bør vi i programmering ikke definere noget to gange.
Der er forskellige tilgange til at afhjælpe dette problem, men her skal vi lære den, der er nemmere for begyndere, og den kaldes arv. I dette tilfælde vil vi oprette et andet klasse-"pattedyr" og definere vores "walk"-attribut i den klasse.
class Mammal:
def walk(self):
print("walk")
Efter at have defineret vores "pattedyr"-klasse kan vi bruge arv til at videregive attributterne som dette:
Både hunde- og katteklasserne arver alle de klassemetoder, der er defineret i deres forældreklasse. Nu kan vi tilføje metoder, der er specifikke for hunde som denne:
class Dog:
def bark(self):
print("bark")
Afslut!
Det hele handlede om klasserne, konstruktørerne og genbrug af koden i klasser med arvekoncepter. Nu nærmer vi os slutningen af vores serie. På dette tidspunkt bør du være i stand til at producere gode, læsbare og kortfattede koder i Python.
Vi vil se konceptet med moduler og pakker i næste foredrag.
Giv en kommentar