In hierdie lesing sal ons leer oor klasse, konstrukteurs en oorerwing in luislang.
Hierdie konsepte is baie belangrik in 'n groot program waar verskillende tipes gedefinieer moet word.
klasse
Klasse is noodsaaklik in programmering en is nie spesifiek vir luislang nie. Baie ander programmeringstale ondersteun die idee van klasse. Ons gebruik klasse om nuwe datatipes te definieer.
Tot dusver het ons geleer oor die basiese datatipes in Python soos getalle, snare en booleans. Dit is die basiese of eenvoudige datatipes in Python. Ons het ook 'n paar komplekse datatipes soos lyste en woordeboeke gesien.
Alhoewel hierdie tipes uiters nuttig is, kan hulle nie altyd gebruik word om komplekse konsepte te modelleer nie. Dink byvoorbeeld aan die idee van 'n punt, of 'n inkopiemandjie. 'n Inkopiemandjie is nie 'n boolean of 'n lys nie. Dit is 'n ander soort data. Ons kan dus klasse gebruik om nuwe tipes te definieer om werklike konsepte te modelleer.
Kom ons definieer nou 'n nuwe datatipe genaamd punt. Hierdie nuwe tipe gaan metodes hê soos ons voorheen nagegaan het.
Dit is hoe jy dit sal doen:
Ons begin deur 'n klas te definieer deur die "klas" sleutelwoord te gebruik en net daarna gee ons ons klas 'n naam.
class Point
Kyk nou na die naamkonvensie wat ek hier gebruik het. Ek het die eerste letter hier gekapitaliseer, dit is wat ons 'n pascal-naamkonvensie noem. Hierdie konvensie verskil van die een wat ons gebruik om ons veranderlikes en funksies te benoem waarvoor ons altyd kleinletters gebruik en veelvuldige woorde skei deur 'n onderstreep te gebruik. Maar wanneer ons klasse benoem, gebruik ons nie 'n onderstreep om veelvuldige woorde te skei nie, ons gebruik die eerste letter van elke woord met hoofletters.
Nadat ons klas gedefinieer is, word 'n dubbelpunt gebruik wat beteken dat nou 'n blok gedefinieer is.
class Point:
def move (self):
In hierdie blok kan ons al die funksies of metodes wat by punte hoort definieer. Ons kan byvoorbeeld 'n funksie genaamd "skuif" definieer om 'n punt te skuif. Let daarop dat sodra ons oop hakies tik, PyCharm outomaties "self" hier byvoeg. Dit is 'n spesiale sleutelwoord en laat ek binnekort hierop terugkom. Kom ons druk "skuif" op die terminale.
print("move")
Kom ons definieer 'n ander metode soos "teken" en druk dit op die terminale.
def draw(self):
print("draw")
Ons is klaar met die definisie van ons “punt”-klas. Met hierdie nuwe tipe kan ons nuwe voorwerpe skep. 'n Klas definieer eenvoudig die bloudruk of die sjabloon vir die skep van voorwerpe wat die werklike gevalle is gebaseer op daardie bloudruk. Om 'n voorwerp te skep, tik ons die naam van ons klas uit en noem dit dan net soos 'n funksie. Dit skep 'n nuwe voorwerp en gee dit dan terug. Dan kan ons daardie voorwerp in 'n veranderlike stoor. Laat ek jou wys:
Hier het ons 'n "punt1" gedefinieer wat 'n driedimensionele punt is. U kan dit sien, ons kan individuele koördinate op die terminaal druk.
Ons kan die twee metodes "teken" en "beweeg" met hierdie punt gebruik.
So om saam te vat, gebruik ons klasse om nuwe tipes te definieer en hierdie tipes kan metodes hê wat ons in die liggaam van die klas definieer. Klasse kan eienskappe hê wat ons enige plek in ons programme kan stel.
vervaardigerskampioenskap
Tot dusver het ons geleer hoe om nuwe tipes te skep deur klasse te gebruik. Nou is daar 'n klein probleem met hierdie implementering. Ons kan 'n puntvoorwerp sonder 'n x- of y-koördinaat skep deur klasse te gebruik en dit is nie ideaal nie. Laat ek jou wys.
Kom ons skep 'n punt en druk dit voordat ons die x-koördinaat stel. Die uitvoering van ons program lei tot 'n kenmerkfout soos hierdie:
Dit beteken dat die puntvoorwerp geen eienskap genaamd x het nie. Nou is die probleem dat dit moontlik is om 'n puntvoorwerp sonder x- of y-koördinate te hê. Dit maak nie sin nie, want wanneer ons oor 'n punt praat, moet ons weet waar daardie punt geleë is. Om hierdie probleem op te los, gebruik ons 'n konstruktor. 'n Konstruktor is 'n funksie wat opgeroep word wanneer 'n voorwerp geskep word.
Hier is hoe ons 'n konstruktor gebruik. Laat ons eers die x- en y-koördinatewaardes in die bogenoemde program deurgee.
point = Point(10, 20)
print(point.x)
Nou moet ons 'n spesiale metode in hierdie klas byvoeg wat 'n konstruktor genoem word. Die sintaksis daarvan is soos volg:
def __init__(self, x, y):
init
is kort vir geïnisialiseer, en dit is die funksie of die metode wat genoem word wanneer 'n nuwe puntvoorwerp geskep word. Die x en y word net daarna bygevoeg self
om twee ekstra parameters by te voeg.
Daarna moet ons die x en y karteer na die geslaagde waardes, dws 10 en 20
self.x = x
self.y = y
Ons gebruik die self
om na die huidige objek te verwys en dan stel ons die x-kenmerk na die x-argument wat na die funksie “x” oorgedra word. Op hierdie manier gebruik init
metode, kan ons ons voorwerpe inisialiseer. Daar word na hierdie metode verwys as 'n konstruktor. Kom ons bestuur ons program.
Nou kan ons die x- en y-koördinate later verander. Kom ons werk x-koördinaat op:
point = Point(10, 20)
point.x = 11
print(point.x)
Nou word die x-koördinaat opgedateer na waarde 11.
Oefening
Hier is 'n interessante oefening vir jou.
Ek wil hê jy moet 'n nuwe tipe genaamd 'n persoon definieer. Hierdie "Persoon"-voorwerpe moet 'n "name
"-kenmerk sowel as 'n "talk()
”Metode.
Dit is 'n eenvoudige taak en behoort nie meer as 'n paar minute te neem nie.
Oplossing
Begin deur die klas "Persoon" soos volg te definieer:
class Person:
self.name = name
Ons sal later die konstruktor definieer. Nou kan ons die "Persoon" voorwerp skep. Kom ons noem dit John
john = Person("John Smith")
print(john.name)
john.talk()
Gaan nou verder na die eerste gedeelte van die kode en skep 'n konstruktor.
def __init__(self, name):
Die finale kode sal soos volg lyk:
Jy kan ook geformateerde stringe en ander konsepte gebruik in samewerking met klasse en konstruktors.
Erfenis
Erfenis is 'n ander konsep wat verband hou met klasse waarmee jy 'n kode kan hergebruik.
Oorweeg hierdie stukkie kode.
class Dog:
def walk(self):
print("walk")
Ons het 'n klas "Hond" geskep met 'n "loop" metode. In hierdie metode druk ons eenvoudig die loopboodskap op die terminaal. Kom ons sê, in 'n regte program is daar 10 reëls kode in plaas van net een reël hier. In die toekoms, as 'n ander klas nodig is om die "loop" metode te hê, sal ons al daardie kode moet herhaal. Dit is nie ideaal nie.
In programmering het ons 'n beginsel genaamd DRY wat kort is vir moenie jouself herhaal nie. Kom ons sê iewers in die toekoms ontdek ons 'n probleem met ons "loop" metode en as ons hierdie metode op baie ander plekke herhaal of gedupliseer het, sal ons moet terugkom en daardie probleem regmaak op elke enkele plek waar ons dit gedupliseer het kode. So dit is hoekom ons in programmering nie iets twee keer moet definieer nie.
Daar is verskillende benaderings om hierdie probleem op te los, maar hier gaan ons die een leer wat makliker is vir beginners en dit word oorerwing genoem. In hierdie geval sal ons 'n ander klas "soogdier" skep en ons "loop" eienskap in daardie klas definieer.
class Mammal:
def walk(self):
print("walk")
Nadat ons ons "Soogdier" klas gedefinieer het, kan ons oorerwing gebruik om die eienskappe soos volg te slaag:
Beide die honde- en katklasse erf al die klasmetodes wat in hul ouerklas gedefinieer is. Nou kan ons metodes spesifiek vir honde soos hierdie byvoeg:
class Dog:
def bark(self):
print("bark")
Afsluit!
Dit het alles gegaan oor die klasse, konstrukteurs en die hergebruik van die kode in klasse met oorerwingskonsepte. Nou nader ons die einde van ons reeks. Teen hierdie punt behoort jy goeie, leesbare en bondige kodes in Python te kan produseer.
Ons sal die konsep van modules en pakkette in die volgende lesing sien.
Lewer Kommentaar