Tabl Cynnwys[Cuddio][Dangos]
Yn y ddarlith hon, byddwn yn dysgu am ddosbarthiadau, adeiladwyr ac etifeddiaeth mewn python.
Mae'r cysyniadau hyn yn wirioneddol bwysig mewn rhaglen fawr lle mae angen diffinio gwahanol fathau.
dosbarthiadau
Mae dosbarthiadau yn hanfodol mewn rhaglennu ac nid ydynt yn benodol i python. Llawer o rai eraill ieithoedd rhaglennu cefnogi'r syniad o ddosbarthiadau. Rydym yn defnyddio dosbarthiadau i ddiffinio mathau newydd o ddata.
Hyd yn hyn, rydym wedi dysgu am y mathau o ddata sylfaenol yn Python fel rhifau, llinynnau, a booleans. Dyma'r mathau data sylfaenol neu syml yn Python. Rydym hefyd wedi gweld cwpl o fathau o ddata cymhleth fel rhestrau a geiriaduron.
Er bod y mathau hyn yn hynod ddefnyddiol, ni ellir eu defnyddio bob amser i fodelu cysyniadau cymhleth. Er enghraifft, meddyliwch am y syniad o bwynt, neu gert siopa. Nid yw trol siopa yn boolean nac yn rhestr. Mae'n fath gwahanol o ddata. Felly gallwn ddefnyddio dosbarthiadau i ddiffinio mathau newydd i fodelu cysyniadau go iawn.
Nawr, gadewch i ni ddiffinio math data newydd o'r enw pwynt. Mae'r math newydd hwn yn mynd i gael dulliau fel y gwnaethom wirio o'r blaen.
Dyma sut y byddwch yn ei wneud:
Rydyn ni'n dechrau trwy ddiffinio dosbarth trwy ddefnyddio'r allweddair “dosbarth” ac yn syth ar ôl hynny rydyn ni'n rhoi enw i'n dosbarth.
class Point
Nawr, edrychwch ar y confensiwn enwi rydw i wedi'i ddefnyddio yma. Rwyf wedi cyfalafu'r llythyren gyntaf yma, dyma'r hyn a alwn yn gonfensiwn enwi pascal. Mae'r confensiwn hwn yn wahanol i'r un a ddefnyddiwn ar gyfer enwi ein newidynnau a swyddogaethau yr ydym bob amser yn defnyddio llythrennau bach ac yn gwahanu geiriau lluosog gan ddefnyddio tanlinellu. Ond wrth enwi dosbarthiadau, nid ydym yn defnyddio tanlinelliad i wahanu geiriau lluosog yn lle hynny, rydym yn cyfalafu llythyren gyntaf pob gair.
Ar ôl diffinio ein dosbarth, defnyddir colon sy'n golygu bod bloc bellach wedi'i ddiffinio.
class Point:
def move (self):
Yn y bloc hwn, gallwn ddiffinio'r holl swyddogaethau neu ddulliau sy'n perthyn i bwyntiau. Er enghraifft, gallwn ddiffinio swyddogaeth o'r enw “symud” ar gyfer symud pwynt. Sylwch, cyn gynted ag y byddwn yn teipio cromfachau agored, mae PyCharm yn ychwanegu “hunan” yma yn awtomatig. Mae hwn yn allweddair arbennig a gadewch i mi fynd yn ôl at hwn yn fuan. Gadewch i ni argraffu “symud” ar y derfynell.
print("move")
Gadewch i ni ddiffinio dull arall fel "tynnu llun" a'i argraffu ar y derfynell.
def draw(self):
print("draw")
Rydyn ni wedi gorffen gyda diffiniad ein dosbarth “pwynt”. Gyda'r math newydd hwn, gallwn greu gwrthrychau newydd. Yn syml, mae dosbarth yn diffinio'r glasbrint neu'r templed ar gyfer creu gwrthrychau sef yr achosion gwirioneddol yn seiliedig ar y glasbrint hwnnw. I greu gwrthrych, rydym yn teipio enw ein dosbarth ac yna'n ei alw'n union fel ffwythiant. Mae hyn yn creu gwrthrych newydd ac yna'n ei ddychwelyd. Yna gallwn storio'r gwrthrych hwnnw mewn newidyn. Gadewch imi ddangos i chi:
Yma rydym wedi diffinio “pwynt 1” sy'n bwynt tri dimensiwn. Gallwch weld hynny, gallwn argraffu cyfesurynnau unigol ar y derfynell.
Gallwn ddefnyddio'r ddau ddull “tynnu llun” a “symud” gyda'r pwynt hwn.
Felly i ailadrodd, rydym yn defnyddio dosbarthiadau i ddiffinio mathau newydd a gall y mathau hyn fod â dulliau yr ydym yn eu diffinio yng nghorff y dosbarth. Gall fod gan ddosbarthiadau nodweddion y gallwn eu gosod yn unrhyw le yn ein rhaglenni.
Adeiladwyr
Hyd yn hyn, rydym wedi dysgu sut i greu mathau newydd gan ddefnyddio dosbarthiadau. Nawr mae problem fach gyda'r gweithrediad hwn. Gallwn greu gwrthrych pwynt heb gyfesuryn x neu y gan ddefnyddio dosbarthiadau ac nid yw hynny'n ddelfrydol. Gadewch i mi ddangos i chi.
Gadewch i ni greu pwynt a'i argraffu cyn i ni osod y cyfesuryn x. Mae rhedeg ein rhaglen yn arwain at wall priodoledd fel hyn:
Mae'n golygu nad oes gan y gwrthrych pwynt unrhyw briodwedd o'r enw x. Nawr y broblem yw ei bod hi'n bosibl cael gwrthrych pwynt heb gyfesurynnau x neu y. Nid yw hyn yn gwneud synnwyr oherwydd pryd bynnag y byddwn yn siarad am bwynt, mae angen inni wybod ble mae'r pwynt hwnnw. I ddatrys y broblem hon, rydym yn defnyddio constructor. Mae lluniwr yn ffwythiant sy'n cael ei alw ar adeg creu gwrthrych.
Dyma sut rydyn ni'n defnyddio adeiladwr. Yn gyntaf, gadewch i ni basio'r gwerthoedd cyfesurynnau x ac y yn y rhaglen uchod.
point = Point(10, 20)
print(point.x)
Yn awr, mae angen i ni ychwanegu dull arbennig yn y dosbarth hwn a elwir yn constructor. Mae ei chystrawen fel hyn:
def __init__(self, x, y):
init
yn fyr ar gyfer ymgychwyn, a dyma'r swyddogaeth neu'r dull sy'n cael ei alw pan fydd gwrthrych pwynt newydd yn cael ei greu. Mae'r x ac y yn cael eu hychwanegu yn syth ar ôl self
ychwanegu dau baramedr ychwanegol.
Ar ôl hynny, dylem fapio'r x ac y i'r gwerthoedd pasio hy 10 ac 20
self.x = x
self.y = y
Rydym yn defnyddio'r self
i gyfeirio at y gwrthrych cyfredol ac yna rydym yn gosod y briodwedd x i'r ddadl x a drosglwyddir i'r ffwythiant "x". Yn y modd hwn, gan ddefnyddio init
dull, gallwn ymgychwyn ein gwrthddrychau. Cyfeirir at y dull hwn fel adeiladwr. Gadewch i ni redeg ein rhaglen.
Nawr, gallwn newid y cyfesurynnau x ac y yn ddiweddarach. Gadewch i ni ddiweddaru x cydlynu:
point = Point(10, 20)
point.x = 11
print(point.x)
Nawr, mae'r cyfesuryn x yn cael ei ddiweddaru i werth 11.
Ymarfer
Dyma ymarfer diddorol i chi.
Rwyf am i chi ddiffinio math newydd o'r enw person. Dylai fod gan y gwrthrychau “Person” hyn “name
” priodoledd yn ogystal â “talk()
”Dull.
Mae'n dasg syml ac ni ddylai gymryd mwy nag ychydig funudau.
Ateb
Dechreuwch gyda diffinio'r dosbarth “Person” fel hyn:
class Person:
self.name = name
Byddwn yn diffinio'r adeiladwr yn ddiweddarach. Nawr, gallwn greu'r gwrthrych "Person". Gadewch i ni ei alw'n John
john = Person("John Smith")
print(john.name)
john.talk()
Nawr, ewch ymlaen i ran gyntaf y cod a chreu lluniwr.
def __init__(self, name):
Bydd y cod terfynol yn edrych fel hyn:
Gallwch hefyd ddefnyddio llinynnau wedi'u fformatio a chysyniadau eraill ar y cyd â dosbarthiadau ac adeiladwyr.
Etifeddiaeth
Mae etifeddiaeth yn gysyniad arall sy'n gysylltiedig â dosbarthiadau sy'n caniatáu ichi ailddefnyddio cod.
Ystyriwch y darn hwn o god.
class Dog:
def walk(self):
print("walk")
Rydym wedi creu dosbarth “Ci” gyda dull “cerdded”. Yn y dull hwn, rydym yn syml yn argraffu'r neges cerdded ar y derfynell. Gadewch i ni ddweud, mewn rhaglen go iawn, Mae yna 10 llinell o god yn hytrach na dim ond un llinell yma. Yn y dyfodol, os oes angen dosbarth arall i gael y dull “cerdded”, bydd yn rhaid i ni ailadrodd yr holl god hwnnw. Nid yw hyn yn ddelfrydol.
Mewn rhaglennu, mae gennym egwyddor o'r enw DRY sy'n fyr oherwydd peidiwch ag ailadrodd eich hun. Gadewch i ni ddweud rywbryd yn y dyfodol, rydyn ni'n darganfod problem gyda'n dull “cerdded” ac os ydyn ni wedi ailadrodd neu ddyblygu'r dull hwn mewn llawer o leoedd eraill, bydd yn rhaid i ni ddod yn ôl a thrwsio'r broblem honno ym mhob man rydyn ni wedi dyblygu hyn. côd. Felly dyna pam mewn rhaglennu na ddylem ddiffinio rhywbeth ddwywaith.
Mae yna wahanol ddulliau o ddatrys y broblem hon ond yma rydyn ni'n mynd i ddysgu'r un sy'n haws i ddechreuwyr ac fe'i gelwir yn etifeddiaeth. Yn yr achos hwn, byddwn yn creu “mamal” dosbarth arall ac yn diffinio ein priodoledd “cerdded” yn y dosbarth hwnnw.
class Mammal:
def walk(self):
print("walk")
Ar ôl diffinio ein dosbarth “Mamaliaid” gallwn ddefnyddio etifeddiaeth i basio'r priodoleddau fel hyn:
Mae'r dosbarthiadau cŵn a chathod yn etifeddu'r holl ddulliau dosbarth a ddiffinnir yn eu dosbarth rhiant. Nawr, gallwn ychwanegu dulliau sy'n benodol i gŵn fel hyn:
class Dog:
def bark(self):
print("bark")
Amlapio!
Roedd hyn i gyd yn ymwneud â'r dosbarthiadau, yr adeiladwyr ac ailddefnyddio'r cod mewn dosbarthiadau â chysyniadau etifeddiaeth. Nawr rydyn ni'n agosáu at ddiwedd ein cyfres. Erbyn hyn, dylech allu cynhyrchu codau da, darllenadwy a chryno yn Python.
Cawn weld y cysyniad o fodiwlau a phecynnau yn y ddarlith nesaf.
Gadael ymateb