Enhavtabelo[Kaŝi][Montri]
En ĉi tiu prelego, ni lernos pri klasoj, konstrukciistoj kaj heredo en python.
Ĉi tiuj konceptoj estas vere gravaj en granda programo kie malsamaj tipoj estas necesaj por esti difinitaj.
klasoj
Klasoj estas esencaj en programado kaj ili ne estas specifaj por python. Multaj aliaj programlingvoj subteni la nocion de klasoj. Ni uzas klasojn por difini novajn datumtipojn.
Ĝis nun, ni lernis pri la bazaj datumtipoj en Python kiel nombroj, ĉenoj kaj buleoj. Ĉi tiuj estas la bazaj aŭ simplaj datumtipoj en Python. Ni ankaŭ vidis kelkajn kompleksajn datumtipojn kiel listoj kaj vortaroj.
Dum ĉi tiuj tipoj estas ekstreme utilaj, ili ne ĉiam povas esti uzataj por modeligi kompleksajn konceptojn. Ekzemple, pensu pri la ideo de punkto, aŭ aĉetĉaro. Aĉetveturilo ne estas buleo aŭ listo. Ĝi estas malsama speco de datumoj. Do ni povas uzi klasojn por difini novajn tipojn por modeligi realajn konceptojn.
Nun, ni difinu novan datumtipo nomatan punkto. Ĉi tiu nova tipo havos metodojn kiel ni kontrolis antaŭe.
Jen kiel vi faros ĝin:
Ni komencas difinante klason uzante la ŝlosilvorton "klaso" kaj tuj poste ni donas nomon al nia klaso.
class Point
Nun, rigardu la nomkonvencion, kiun mi uzis ĉi tie. Mi majuskligis la unuan literon ĉi tie, jen kion ni nomas paskala nomkonvencio. Ĉi tiu konvencio diferencas de tiu, kiun ni uzas por nomi niajn variablojn kaj funkciojn, por kiuj ni ĉiam uzas minusklojn kaj apartigas plurajn vortojn per substreko. Sed dum nomado de klasoj, ni ne uzas substrekon por apartigi plurajn vortojn anstataŭe, ni majuskligi la unuan literon de ĉiu vorto.
Post difini nian klason, dupunkto estas uzata, kio signifas, ke nun bloko estas difinita.
class Point:
def move (self):
En ĉi tiu bloko, ni povas difini ĉiujn funkciojn aŭ metodojn kiuj apartenas al punktoj. Ekzemple, ni povas difini funkcion nomatan "movo" por movi punkton. Notu, ke tuj kiam ni tajpas malfermajn krampojn, PyCharm aŭtomate aldonas "mem" ĉi tie. Ĉi tio estas speciala ŝlosilvorto kaj lasu min reveni al ĉi tio baldaŭ. Ni presi "movo" sur la terminalo.
print("move")
Ni difinu alian metodon kiel "desegni" kaj presi ĝin sur la terminalo.
def draw(self):
print("draw")
Ni finis kun la difino de nia "punkta" klaso. Kun ĉi tiu nova tipo, ni povas krei novajn objektojn. Klaso simple difinas la skizon aŭ la ŝablonon por krei objektojn, kiuj estas la realaj kazoj bazitaj sur tiu skizo. Por krei objekton, ni tajpas la nomon de nia klaso kaj poste nomas ĝin kiel funkcio. Ĉi tio kreas novan objekton kaj poste resendas ĝin. Tiam ni povas konservi tiun objekton en variablo. Lasu min montri al vi:
Ĉi tie ni difinis "punkto1" kiu estas tridimensia punkto. Vi povas vidi tion, ni povas presi individuajn koordinatojn sur la terminalo.
Ni povas uzi la du metodojn "desegni" kaj "movi" kun ĉi tiu punkto.
Do por resumi, ni uzas klasojn por difini novajn tipojn kaj ĉi tiuj tipoj povas havi metodojn, kiujn ni difinas en la korpo de la klaso. Klasoj povas havi atributojn, kiujn ni povas agordi ie ajn en niaj programoj.
Konstruistoj
Ĝis nun, ni lernis kiel krei novajn tipojn uzante klasojn. Nun estas malgranda problemo kun ĉi tiu efektivigo. Ni povas krei punktobjekton sen x aŭ y koordinato uzante klasojn kaj tio ne estas ideala. Lasu min montri al vi.
Ni kreu punkton kaj presi ĝin antaŭ ol ni fiksas la x-koordinaton. Ruli nian programon rezultigas atributan eraron kiel ĉi tio:
Ĝi signifas ke la punktobjekto havas neniun atributon nomitan x. Nun la problemo estas, ke eblas havi punktobjekton sen x aŭ y koordinatoj. Ĉi tio ne havas sencon ĉar kiam ajn ni parolas pri punkto, ni devas scii kie tiu punkto situas. Por solvi ĉi tiun problemon, ni uzas konstruilon. Konstrukciisto estas funkcio kiu estas vokita en la momento de kreado de objekto.
Jen kiel ni uzas konstruilon. Unue, ni pasu la x kaj y-koordinatajn valorojn en la supra programo.
point = Point(10, 20)
print(point.x)
Nun, ni devas aldoni specialan metodon en ĉi tiu klaso nomata konstrukciisto. Ĝia sintakso estas tia:
def __init__(self, x, y):
init
estas mallongigo de pravalorigita, kaj ĉi tiu estas la funkcio aŭ la metodo kiu estas vokita kiam nova punktobjekto estas kreita. La x kaj y estas aldonitaj tuj poste self
aldoni du kromajn parametrojn.
Post tio, ni devus mapi la x kaj y al la pasitaj valoroj t.e. 10 kaj 20
self.x = x
self.y = y
Ni uzas la self
por referenci al la nuna objekto kaj tiam ni fiksas la x-atributon al la x-argumento pasita al la funkcio "x". Tiamaniere, uzante init
metodo, ni povas pravalorigi niajn objektojn. Ĉi tiu metodo estas nomata konstrukciisto. Ni rulu nian programon.
Nun ni povas ŝanĝi la x kaj y-koordinatojn poste. Ni ĝisdatigu x-koordinaton:
point = Point(10, 20)
point.x = 11
print(point.x)
Nun, la x-koordinato estas ĝisdatigita al valoro 11.
ekzerco
Jen interesa ekzerco por vi.
Mi volas, ke vi difinu novan tipon nomatan persono. Ĉi tiuj "Persono" objektoj havu "name
”atributo same kiel “talk()
”Metodo.
Ĝi estas simpla tasko kaj ne devus daŭri pli ol kelkajn minutojn.
solvaĵo
Komencu difinante la klason "Persono" tiel:
class Person:
self.name = name
Ni difinos la konstruilon poste. Nun ni povas krei la objekton "Persono". Ni nomu ĝin Johano
john = Person("John Smith")
print(john.name)
john.talk()
Nun, iru al la unua parto de la kodo kaj kreu konstruilon.
def __init__(self, name):
La fina kodo aspektos jene:
Vi ankaŭ povas uzi formatitajn ĉenojn kaj aliajn konceptojn kune kun klasoj kaj konstrukciistoj.
heredaĵo
Heredo estas alia koncepto asociita kun klasoj, kiuj permesas reuzi kodon.
Konsideru ĉi tiun kodon.
class Dog:
def walk(self):
print("walk")
Ni kreis klason "Hundo" kun metodo "promenado". En ĉi tiu metodo, ni simple presas la promenmesaĝon sur la terminalo. Ni diru, en reala programo, Estas 10 linioj de kodo anstataŭ nur unu linio ĉi tie. Estonte, se necesas alia klaso por havi la metodon "marŝi", ni devos ripeti tiun tutan kodon. Ĉi tio ne estas ideala.
En programado, ni havas principon nomatan DRY, kiu estas mallonga por ne ripetu vin. Ni diru iam en la estonteco, ni malkovras problemon kun nia "promenado" metodo kaj se ni ripetis aŭ duobligis ĉi tiun metodon en multaj aliaj lokoj, ni devos reveni kaj ripari tiun problemon en ĉiu loko, kie ni duobligis ĉi tion. kodo. Tial en programado ni ne difinu ion dufoje.
Estas malsamaj aliroj por solvi ĉi tiun problemon, sed ĉi tie ni lernos tiun, kiu estas pli facila por komencantoj kaj ĝi nomiĝas heredo. En ĉi tiu kazo, ni kreos alian klason "mamulo" kaj difinos nian "marŝi" atributon en tiu klaso.
class Mammal:
def walk(self):
print("walk")
Post difini nian "Mamulojn" klason ni povas uzi heredon por transdoni la atributojn jene:
Kaj la hundo kaj kato klasoj heredas ĉiujn klasmetodojn difinitajn en sia gepatra klaso. Nun ni povas aldoni metodojn specifajn por hundoj kiel ĉi tio:
class Dog:
def bark(self):
print("bark")
Envolviĝu!
Ĉi tio temis pri la klasoj, konstruiloj kaj reuzado de la kodo en klasoj kun heredaj konceptoj. Nun ni proksimiĝas al la fino de nia serio. Je ĉi tiu punkto, vi devus povi produkti bonajn, legeblajn kaj koncizajn kodojn en Python.
Ni vidos la koncepton de moduloj kaj pakaĵoj en la sekva prelego.
Lasi Respondon