Ачааллж байна...
Өмнөх хичээлийн Nohoi маань шинжтэй (нэр, настай) — гэхдээ юу ч чаддаггүй: зөгнөлт киноны хөлдөөсөн амьтан шиг зүгээр л "байдаг." Жинхэнэ нохой хуцдаг, гүйдэг, сүүлээ шарвадаг шүү дээ — өнөөдөр бид зураг төсөлдөө чадвар нэмнэ: нохойгоо хуцуулж сурна. Class доторх чадварыг юу гэж нэрлэдгийг та аль хэдийн мэднэ — method: Бүлэг 9-д string-ийн "авдрын багажуудыг" бид яг энэ нэрээр танилцуулж, "утгандаа харьяалагддаг function" гэж тодорхойлж, "цэгний цаана Python-ы том санаа бий — Бүлэг 14-т" гэж амлаж байсан. Тэр амлалтын төлөлт өнөөдөр бүрэн хийгдэнэ: ner.upper() гэж мянга бичихдээ та юу дуудаж байсан бэ гэдэг асуултын хариулт — таны өөрийн гараар бичсэн method дотроос гарч ирнэ: авдрын нууц дотроос нь тайлагдана гэсэн үг.
Сайхан мэдээ нь: өнөөдөр сурах шинэ бичиглэл бараг алга — method гэдэг нь class-ын биед бичигдсэн энгийн def: таны Бүлэг 8-ын бүх мэдлэг (parameter, return, дуудлага) шууд ажиллана — нэмэгдэх нь ганцхан танил зочин: self, энэ удаад "угсрагчийн" биш жирийн ажилтны дүрээр.
Зураг төслийн цаас маань хоёр хэсэгтэй болно. Эхний хэсэг нь хуучин танил: эд ангийн жагсаалт — "нохой болгон нэртэй, настай" (шинжүүд — init-ийн ажил). Одоо хоёр дахь хуудас нэмэгдэнэ: чадварын хуудас — "нохой болгон хуцаж чадна: хуцахдаа ингэж дуугарна..." — үйлдлүүдийн заавар. Хоёр хуудасны нэг амин холбоог ажиглаарай: чадварын зааврууд эд ангиудаа хэрэглэдэг — "хуцахдаа өөрийн нэрээ хэлж хуцна" гэвэл заавар нь нэр гэдэг эд ангид хандана: тиймээс чадварын хуудасны мөр болгонд "өөрийн" гэсэн үг эргэлдэнэ — таны таамагласнаар: тэр "өөрийн" нь self. Тэгээд угсрагдсан машин бүр зураг төслийнхөө бүх чадвартай мэндэлдэг — Банхар ч хуцаж чадна, Аслан ч: чадвар нэг л газар (цаасан дээр) бичигдсэн ч биелэл болгонд "дагалддаг" — Бүлэг 9-ийн "авдар string бүрд дагалддаг" гэсэн ажиглалтын яг тэр механизм.
Nohoi-гоо хуцуулъя:
python
class Nohoi:
def __init__(self, ner, nas):
self.ner = ner
self.nas = nas
def hutsah(self):
print(f"{self.ner}: Хов хов!")
minii = Nohoi("Банхар", 3)
minii.hutsah()Үр дүн:
Банхар: Хов хов!Задалъя. def hutsah(self): — class-ын биед хоёр дахь def: init-тэй нэг түвшинд шигдсэн (хоёул зураг төслийн "хуудсууд"), нэр нь энэ удаад таны сонгосон энгийн нэр (гэрээт init шиг тусгай биш — hutsah, guih, unt... юу ч байж болно: function-ий нэрийн бүх дүрэм). Parameter нь ганц self — өмнөх хичээлийн жор ажиллаж байна: "class доторх def-ийн эхний parameter нь үргэлж self" — өөр орц хэрэггүй method-д self дангаараа зогсдог. Биед нь self.ner — чадварын хуудасны "өөрийн нэрээ хэлж хуцна" гэсэн мөр: method шинжид хандахдаа мөн л self. угтвараар — угсрагчийн хадсан шошгыг ажилтан нь уншиж байна: init бичдэг, hutsah уншдаг — хоёул нэг self-ээр дамжуулан нэг нохойн нэг шошготой ажиллаж байгаа нь object-ын "дотоод ертөнц" юм. minii.hutsah() — дуудлага: цэг + нэр + хаалт... энэ хэлбэрийг та хаанаас мэдэх билээ — ner.upper(), jagsaalt.append(), f.read(): таны хоёр Түвшний турш бичсэн тэр л хөдөлгөөн — зөвхөн энэ удаад дуудаж буй method чинь таны өөрийн бичсэн нь!
Тэгээд self-ийн хоёр дахь нууц энд тайлагдана: hutsah(self) гэж нэг parameter зарлаад minii.hutsah() гэж тэг argument-тэй дуудлаа — тоо зөрөөгүй юу? Үгүй: цэгийн өмнөх minii өөрөө self-ийн суудалд автоматаар очдог — minii.hutsah() гэдэг нь Python-ы нүдээр "hutsah-ыг дууд, self нь minii" гэсэн үг: цэгийн өмнөх object нь эхний argument нь болдог — энэ л дүрэм цэгэн дуудлагын бүх механик юм: ner.upper() гэхэд ner тэр string-ийн upper-ийн self-д очдог байжээ — авдрын нууц: авдар гэж тусдаа юм байгаагүй — class-ын биед бичээстэй method-ууд, цэгээр очдог self байж.
Хоёр дахь жишээ: parameter-тай method. Self-ээс гадна ердийн орц авч болно:
python
class Nohoi:
def __init__(self, ner, nas):
self.ner = ner
self.nas = nas
def hutsah(self, davtalt):
for i in range(davtalt):
print(f"{self.ner}: Хов!")
minii = Nohoi("Банхар", 3)
minii.hutsah(3)Үр дүн:
Банхар: Хов!
Банхар: Хов!
Банхар: Хов!def hutsah(self, davtalt) — self эхэндээ, дараа нь ердийн parameter: дуудлага minii.hutsah(3) — цэгийн өмнөх minii → self, хаалтан доторх 3 → davtalt: хоёр суваг зэрэг ажиллав. Биед нь for — method дотор таны бүх хуучин хэрэгсэл (loop, if, бүр өөр method дуудах нь ч) чөлөөтэй: method бол л function. Replace("бороотой", "нартай")-г санаж байна уу — string-ийн хоёр argument-тай method: одоо түүний бүтэц танд ил: def replace(self, juug, jugaar) маягийн зарлалтай байж таарна.
Гурав дахь жишээ: return-тэй method — гардуулдаг чадвар. Хэвлэдэг биш гардуулдаг method:
python
class Nohoi:
def __init__(self, ner, nas):
self.ner = ner
self.nas = nas
def hunii_nas(self):
return self.nas * 7
minii = Nohoi("Банхар", 3)
hun_nas = minii.hunii_nas()
print(f"{minii.ner} хүний насаар {hun_nas} настай")
if minii.hunii_nas() > 40:
print("Ахимаг үеийн нохой")Өмнөх хичээлийн "нохойн нас × 7" тооцоо method болж зураг төсөлдөө нүүж орлоо: тооцооны мэдлэг одоо нохой болгонд дагалддаг — хэрэглэгч нь томьёог мэдэх шаардлагагүй: асуугаад л авна. Return-ий бүх эрх: хадгалагдана, нөхцөлд шүүгдэнэ. Тэгээд Бүлэг 8-ын "print үү return үү" сонголт method-д мөн хүчинтэй: hutsah шиг "хийх нь өөрөө ажил" бол print, hunii_nas шиг "үр дүн" бол return — хуучин дүрэм шинэ гэртээ.
Дөрөв дэх жишээ: шинж өөрчилдөг method — object "амьдардаг" болов. Method өөрийн шинжээ өөрчилж чаддаг — энд class-ын жинхэнэ гоо эхэлнэ:
python
class Nohoi:
def __init__(self, ner, nas):
self.ner = ner
self.nas = nas
def tursun_udur(self):
self.nas = self.nas + 1
print(f"{self.ner} {self.nas} нас хүрлээ!")
minii = Nohoi("Банхар", 3)
minii.tursun_udur()
minii.tursun_udur()
print(minii.nas)Үр дүн:
Банхар 4 нас хүрлээ!
Банхар 5 нас хүрлээ!
5self.nas = self.nas + 1 — оньсого мөр method дотор: нохой өөрөө өөрийгөө өсгөж байна. Өмнөх хичээлд бид насыг гаднаас (minii.nas = minii.nas + 1) өөрчилж байсан — одоо тэр үйлдэл зураг төслийн дотор орж "төрсөн өдөр" гэсэн нэртэй, утгатай үйл явдал боллоо: гадны код зөвхөн minii.tursun_udur() гэж "юу болохыг" хэлдэг — "яаж болохыг" (нас нэмэгдэж, мэдэгдэл гарна) зураг төсөл дотроо мэддэг. Энэ хуваарь — өгөгдөл ба түүний үйлдлүүд нэг гэрт — бол class гэдэг санааны жинхэнэ цөм: dictionary-тэй зэрэгцүүлсэн өмнөх хичээлийн "шийдвэрлэх ялгаа" гэсэн амлалт энд төлөгдөв: толь шинж тээдэг — class шинж ба чадвар хоёуланг нь.
Хүсвэл туршаад үзээрэй: Nohoi-доо taniltsah method нэмээрэй — "Намайг Банхар гэдэг, би 3 настай" гэсэн өгүүлбэр гардуулдаг (return + f-string + хоёр шинж): бичээд print(minii.taniltsah()) гэж шалга. Сонирхвол list-тэй гүүр тавьж үзээрэй: хоёр нохойгоо list-д хийгээд (nohoid = [minii, niiziin] — object жагсаалтын гишүүн болж чадна!) for nohoi in nohoid: nohoi.hutsah() — таны хоёр том ертөнц (цуглуулга ба class) анх удаа гар барилцана: дараагийн хичээлийн гол дүр зураг энэ.
Алдаа 1: Method-ын self-ийг мартах. Өмнөх хичээлийн алдаа шинэ хувилбараараа — гэхдээ өөр мэдэгдэлтэй:
python
class Nohoi:
def __init__(self, ner, nas):
self.ner = ner
self.nas = nas
def hutsah():
print("Хов хов!")
minii = Nohoi("Банхар", 3)
minii.hutsah()Python:
TypeError: Nohoi.hutsah() takes 0 positional arguments but 1 was given"0 авдаг байтал 1 өглөө" — та юу ч өгөөгүй мөртлөө! Тэр нэг нь — цэгийн өмнөх minii: цэгэн дуудлага object-оо эхний суудалд автоматаар явуулдаг журмаа биелүүлсэн — суудал нь л байсангүй. Оношийн дүрэм өмнөх хичээлийнхтэй нэг гэр бүл: class доторх def-тэй холбоотой TypeError-ын тоонууд "нэгээр зөрвөл" — self: 0 гэтэл 1, 2 гэтэл 3 — далд зочны суудлыг шалга.
Алдаа 2: Method дотроо шинжээ self-гүй дуудах. Хоёр ертөнцийн хольц method дотор:
python
class Nohoi:
def __init__(self, ner, nas):
self.ner = ner
self.nas = nas
def hutsah(self):
print(f"{ner}: Хов хов!")
minii = Nohoi("Банхар", 3)
minii.hutsah()Python:
NameError: name 'ner' is not defined"ner гэдэг нэр танихгүй" — гэтэл init дотор self.ner гээд хадсан шүү дээ?! Хадсан нь үнэн — гэхдээ нохойн шошгонд: method-ын дотоод ертөнцөд ner гэдэг дан нэр байхгүй (тэр зөвхөн init-ийн түр parameter байсан — угсралт дуустал!): шошгыг унших цор ганц зам — эзнээр нь дамжих: self.ner. Дүрэм: method дотроос шинжид хандах болгонд self. угтвар — "миний" гэж хэлэлгүй "нэр" гэвэл Python "хэний нэр?" гэж эргэлздэг гэж бод: NameError гарч буй нэр чинь шинжийнхээ нэр байвал — self.-ээ шалга.
Алдаа 3: Method-ыг class-ын гадна шигдүүлчихэх. Шигдэлтийн нэг зөөлөн урхи:
python
class Nohoi:
def __init__(self, ner, nas):
self.ner = ner
self.nas = nas
def hutsah(self):
print(f"{self.ner}: Хов хов!")
minii = Nohoi("Банхар", 3)
minii.hutsah()Python:
AttributeError: 'Nohoi' object has no attribute 'hutsah'"Nohoi object-д hutsah гэж алга" — гэтэл hutsah бичээстэй байна шүү дээ! Ойрхон хараарай: def hutsah нь class-ын биеэс гадна (шигдэлтгүй, хамгийн зүүн захад) байна — Python түүнийг зураг төслийн хуудас биш ердийн бие даасан function гэж уншжээ: чадварын хуудас цааснаасаа унаад "эзэнгүй" хэвтэж байгаа юм. Class-ын "бие" гэдэг нь шигдэлтээр л тодорхойлогддог — for, if, def-ийн биетэй яг нэг хууль: method болгон class-ын нэрнээс нэг шат дотогш. Онош: "бичсэн method маань has no attribute гэвэл" — шигдэлтээ шалга: VS Code дээр class-ын нэрэн дээр хулгана аваачихад бүтцийг нь харуулдаг, эсвэл хамгийн энгийнээр — method чинь init-тэйгээ нэг босоо шугаманд эхэлж байгаа эсэхийг нүдээрээ тулга.
Method бол class-ын биед бичсэн def — object болгонд дагалддаг чадвар: зарлахдаа эхний parameter нь self, түүний дараа ердийн parameter-ууд; биед нь бүх хуучин хэрэгсэл (loop, if, return) чөлөөтэй.
Цэгэн дуудлагын нууц тайлагдав: minii.hutsah() — цэгийн өмнөх object нь self-ийн суудалд автоматаар очдог: ner.upper() гэж хоёр Түвшин бичсэн хөдөлгөөн чинь яг энэ механизм байжээ.
Method шинжээ self.-ээр уншина (hutsah), бичнэ (tursun_udur — object өөрийгөө өөрчилдөг): өгөгдөл ба үйлдэл нэг гэрт — class-ын цөм санаа, dictionary-ээс ялгарах шийдвэрлэх зүйл.
Print/return-ий хуваарь method-д хэвээрээ: үйлдэл бол print, үр дүн бол return.
Гурван онош: тоо "нэгээр зөрсөн" TypeError — self мартагдав; шинжийн нэрэн дээрх NameError — self. угтвар гээгдэв; бичсэн method-ын AttributeError — шигдэлт class-аас унажээ.
Дараагийн хичээл бол энэ бүлгийн төгсгөл: олон object нэг class-аас — нэг зураг төслөөс бүтэн "сүрэг" угсарч, list-тэй нийлүүлж, "нэг тодорхойлолт — олон юм" гэсэн хэв маягийн жинхэнэ хүчийг харна: таны туршилтын "хоёр нохойн гар барилт" тэнд бүрэн жүжиг болно.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.