Table of Contents[Ferstopje][Toanje]
Yn dizze lêzing sille wy leare oer klassen, konstruktors en erfenis yn python.
Dizze begripen binne echt wichtich yn in grut programma wêr't ferskate soarten nedich binne om te definiearjen.
klassen
Klassen binne essensjeel yn programmearring en se binne net spesifyk foar python. In protte oaren programmeertalen stypje it begryp klassen. Wy brûke klassen om nije gegevenstypen te definiearjen.
Oant no hawwe wy leard oer de basisgegevenstypen yn Python lykas sifers, snaren en booleans. Dit binne de basis as ienfâldige gegevenstypen yn Python. Wy hawwe ek in pear komplekse gegevenstypen sjoen lykas listen en wurdboeken.
Hoewol dizze soarten ekstreem nuttich binne, kinne se net altyd brûkt wurde om komplekse konsepten te modellearjen. Tink bygelyks oan it idee fan in punt, of in winkelkarre. In winkelkarre is gjin boolean of in list. It is in oar soarte fan gegevens. Sa kinne wy klassen brûke om nije typen te definiearjen om echte konsepten te modellearjen.
Litte wy no in nij gegevenstype definiearje mei de namme punt. Dit nije type sil metoaden hawwe lykas wy earder hifke.
Dit is hoe't jo it sille dwaan:
Wy begjinne mei it definiearjen fan in klasse troch it kaaiwurd "klasse" te brûken en fuort dêrnei jouwe wy ús klasse in namme.
class Point
Sjoch no nei de nammejouwing dy't ik hjir haw brûkt. Ik haw hjir de earste letter mei in haadletter skreaun, dit is wat wy in pascal-nammekonvinsje neame. Dizze konvinsje is oars as dejinge dy't wy brûke foar it neamen fan ús fariabelen en funksjes wêrfoar wy altyd lytse letters brûke en meardere wurden skiede mei in ûnderstreekje. Mar by it neamen fan klassen brûke wy gjin ûnderstreekje om meardere wurden te skieden ynstee, wy sette de earste letter fan elk wurd mei haadletter.
Nei it definiearjen fan ús klasse wurdt in kolon brûkt wat betsjut dat no in blok definiearre is.
class Point:
def move (self):
Yn dit blok kinne wy alle funksjes of metoaden definiearje dy't by punten hearre. Wy kinne bygelyks in funksje definiearje neamd "ferpleatse" foar it ferpleatsen fan in punt. Tink derom dat sa gau as wy iepen heakjes ynfiere, PyCharm hjir automatysk "sels" tafoegje. Dit is in spesjaal kaaiwurd en lit my hjir koart op weromkomme. Litte wy "ferpleatse" op 'e terminal printsje.
print("move")
Litte wy in oare metoade definiearje lykas "tekenje" en printsje it op 'e terminal.
def draw(self):
print("draw")
Wy binne klear mei de definysje fan ús "punt" klasse. Mei dit nije type kinne wy nije objekten oanmeitsje. In klasse definiearret gewoan de blauprint of it sjabloan foar it meitsjen fan objekten dy't de eigentlike eksimplaren binne basearre op dy blauwdruk. Om in objekt te meitsjen, typearje wy de namme fan ús klasse en neame it dan krekt as in funksje. Dit makket in nij objekt en jout it dan werom. Dan kinne wy dat objekt opslaan yn in fariabele. Lit my dy sjen litte:
Hjir hawwe wy in "punt1" definieare dat in trijediminsjonaal punt is. Jo kinne sjen dat, wy kinne printsje yndividuele koördinaten op de terminal.
Wy kinne de twa metoaden "tekenje" en "ferpleatse" brûke mei dit punt.
Dus om opnij te meitsjen, brûke wy klassen om nije typen te definiearjen en dizze typen kinne metoaden hawwe dy't wy definiearje yn it lichem fan 'e klasse. Klassen kinne attributen hawwe dy't wy oeral yn ús programma's kinne ynstelle.
Konstrukteurs
Oant no hawwe wy leard hoe't jo nije typen kinne meitsje mei klassen. No is d'r in lyts probleem mei dizze ymplemintaasje. Wy kinne in puntobjekt meitsje sûnder in x- of y-koördinaat mei klassen en dat is net ideaal. Lit my dy sjen litte.
Litte wy in punt oanmeitsje en it printsje foardat wy de x-koördinaat ynstelle. It útfieren fan ús programma resultearret yn in attribuutflater lykas dit:
It betsjut dat it punt foarwerp hat gjin attribút neamd x. No is it probleem dat it mooglik is om in puntobjekt te hawwen sûnder x- of y-koördinaten. Dit makket gjin sin, want as wy oer in punt prate, moatte wy witte wêr't dat punt leit. Om dit probleem op te lossen, brûke wy in konstruktor. In konstruktor is in funksje dy't oproppen wurdt op it momint fan it meitsjen fan in objekt.
Hjir is hoe't wy in konstruktor brûke. Lit ús earst de x- en y-koördinearrewearden yn it boppesteande programma trochjaan.
point = Point(10, 20)
print(point.x)
No moatte wy in spesjale metoade tafoegje yn dizze klasse neamd in constructor. De syntaksis is sa:
def __init__(self, x, y):
init
is koart foar inisjalisearre, en dit is de funksje of de metoade dy't wurdt neamd as in nij punt foarwerp wurdt oanmakke. De x en y wurde tafoege direkt nei self
om twa ekstra parameters ta te foegjen.
Dêrnei moatte wy de x en y yn kaart bringe nei de trochjûne wearden ie 10 en 20
self.x = x
self.y = y
Wy brûke it self
om te ferwizen nei it aktuele objekt en dan sette wy it x-attribuut oan it x-argumint trochjûn oan de funksje "x". Op dizze manier brûke init
metoade kinne wy ús objekten inisjalisearje. Dizze metoade wurdt oantsjut as in constructor. Litte wy ús programma útfiere.
No kinne wy de x- en y-koordinaten letter feroarje. Litte wy x-koördinaat bywurkje:
point = Point(10, 20)
point.x = 11
print(point.x)
No wurdt de x-koördinaat bywurke nei wearde 11.
Oefenje
Hjir is in nijsgjirrige oefening foar jo.
Ik wol dat jo in nij type definiearje dy't in persoan hjit. Dizze "persoan" objekten moatte in "name
"attribút as in"talk()
" metoade.
It is in ienfâldige taak en moat net mear as in pear minuten duorje.
Oplossing
Begjin mei it definiearjen fan 'e klasse "Persoan" sa:
class Person:
self.name = name
Wy sille de konstruktor letter definiearje. No kinne wy it objekt "Persoan" oanmeitsje. Litte wy it John neame
john = Person("John Smith")
print(john.name)
john.talk()
Gean no troch nei it earste diel fan 'e koade en meitsje in konstruktor.
def __init__(self, name):
De definitive koade sil der sa útsjen:
Jo kinne ek opmakke snaren en oare begripen brûke yn kombinaasje mei klassen en konstruktors.
Erfenis
Erfskip is in oar konsept ferbûn mei klassen wêrmei jo in koade opnij brûke.
Beskôgje dit stikje koade.
class Dog:
def walk(self):
print("walk")
Wy hawwe in klasse "Hûn" makke mei in "kuier" metoade. Yn dizze metoade drukke wy gewoan it kuierberjocht op 'e terminal. Litte wy sizze, yn in echte programma, Der binne 10 rigels koade ynstee fan mar ien rigel hjir. Yn 'e takomst, as in oare klasse nedich is om de "kuier" metoade te hawwen, sille wy al dy koade moatte werhelje. Dit is net ideaal.
Yn programmearring hawwe wy in prinsipe neamd DRY dat koart is foar josels net werhelje. Litte wy sizze ienris yn 'e takomst, wy ûntdekke in probleem mei ús "kuier" metoade en as wy dizze metoade hawwe werhelle of duplicated op in protte oare plakken, wy sille moatte komme werom en reparearje dat probleem op elk plak dêr't wy hawwe duplicated dit koade. Dat is de reden dat wy yn programmearring net twa kear wat moatte definiearje.
D'r binne ferskate oanpak om dit probleem op te lossen, mar hjir sille wy dejinge leare dy't makliker is foar begjinners en it wurdt erfskip neamd. Yn dit gefal, wy sille meitsje in oare klasse "sûchdier" en definiearje ús "walk" attribút yn dy klasse.
class Mammal:
def walk(self):
print("walk")
Nei it definiearjen fan ús "Sûchdier" klasse kinne wy erfenis brûke om de attributen sa troch te jaan:
Sawol de hûn- as katklassen erfje alle klassemetoaden definieare yn har âlderklasse. No kinne wy metoaden tafoegje spesifyk foar hûnen lykas dit:
class Dog:
def bark(self):
print("bark")
Gearfetsje!
Dit gie alles oer de klassen, konstruktors en it opnij brûken fan de koade yn klassen mei erfskipbegripen. No binne wy tichtby it ein fan ús searje. Op dit punt moatte jo goede, lêsbere en beknopte koades kinne produsearje yn Python.
Wy sille it konsept fan modules en pakketten sjen yn 'e folgjende lêzing.
Leave a Reply