Ачааллж байна...
Class бүлгийн төгсгөлийн хичээлд бид энэ бүх санааны "төлбөрийг" хүлээж авна. Гурван хичээлийн турш бид зураг төсөл зохиож (class), угсрагч бичиж (init), чадвар нэмж (method) ирлээ — гэхдээ шударгаар хэлэхэд: нэг нохойны төлөө энэ бүх барилга илүүдэлтэй байсан: ганц Банхарын нэр, насыг хоёр variable-д хийгээд hutsah гэдэг энгийн function бичихэд л хангалттай байх байсан биз дээ. Class-ын жинхэнэ хүч нэгэн дээр харагддаггүй — олон дээр дэлбэрдэг: зураг төслийн бүх утга нь "нэг цаас — мянган машин" гэдэгт байдгийг өчигдрөөс бид мэднэ. Өнөөдөр конвейерээ жинхэнээсээ ажиллуулна: нэг class-аас бүтэн сүрэг угсарч, тэднийг list-д цуглуулж, loop-оор алхаж, тус бүрийнх нь бие даасан амьдралыг нүдээрээ үзнэ — тэгээд "нэг тодорхойлолт — олон юм" гэсэн энэ хэв маяг яагаад дэлхийн бүх том программын араг яс болдгийг ойлгоно.
Бичиглэлийн хувьд өнөөдөр шинэ зүйл тэг: та бүх эд ангиа мэднэ — class, object, list, loop: өнөөдрийн ажил бол тэднийг анх удаа нэг найрал хөгжимд тоглуулах явдал.
Өмнөх хичээлийн "гэрийн даалгаврын" гурав дахь зүйрлэл өнөөдрийн гол дүр: сурагчийн анкет. Сургуулийн нярав нэг маягт зохионо: "Нэр: ___, Нас: ___" гэсэн хоёр нүхтэй цаас — энэ бол class: нэг л удаа зохиогдоно. Хичээлийн жил эхлэхэд гуч сурагч ирж, хүн бүр маягтыг өөрөө бөглөнө — гучин бөглөгдсөн анкет: гучин object. Одоо гурван ажиглалт. Нэг: анкетууд хэлбэрээрээ ижил (бүгд нэг маягтын үр — бүгд "Нэр" ба "Нас" гэсэн мөртэй: нэг class-ын object болгон ижил шинжүүдтэй), гэхдээ агуулгаараа өөр (Батынхад "Бат, 12", Сараагийнхад "Сараа, 13": шинж болгоны утга нь тус тусынх). Хоёр: нэг анкетад залруулга хийхэд (Бат нас нэмэхэд) бусад хорин есөн анкет үл хөндөгдөнө — биелэл болгон бие даасан. Гурав — өнөөдрийн шинэ дүр: гучин анкетыг нярав хавтсанд хийж хадгална — хавтас нь юу вэ: object-уудын list! Тэгээд "ангийн бүх сурагчийг дууд" гэвэл хавтсаа нээгээд анкет бүрээр дараалан явна: object-уудын list дээрх for loop. Маягт (class) + анкетууд (object-ууд) + хавтас (list) + нэг бүрчлэн үзэх (loop) — өнөөдрийн бүтэн найрал энэ дөрвөн дүрээс бүтнэ.
Сүргээ угсаръя:
python
class Nohoi:
def __init__(self, ner, nas):
self.ner = ner
self.nas = nas
def hutsah(self):
print(f"{self.ner}: Хов хов!")
banhar = Nohoi("Банхар", 3)
aslan = Nohoi("Аслан", 7)
tsookhor = Nohoi("Цоохор", 1)
banhar.hutsah()
aslan.hutsah()
tsookhor.hutsah()Үр дүн:
Банхар: Хов хов!
Аслан: Хов хов!
Цоохор: Хов хов!Нэг зураг төсөл — гурван дуудлага — гурван нохой: угсралт болгонд init шинээр ажиллаж (self нь удаа бүр өөр нохойг зааж — Банхарын угсралтад мэндэлж буй Банхарыг, Аслангийнхад Асланг...), нохой болгонд өөрийн хоёр шошго хадагдав. Гурван hutsah дуудлагыг ажигла: method нэг л газар бичигдсэн — гэтэл гурван өөр нэр хэвлэгдэв: цэгийн өмнөх object нь self-д очдог өчигдрийн журам гурван дуудлагад гурван өөр нохойг "өөрийг нь" илгээсэн хэрэг: код нэг — биелэл бүрд өөрийн өнгөөр. Энд DRY зарчмын оргил хэлбэр харагдаж байна: гурван нохойны мэдээллийг гурван хос variable-д (banhar_ner, banhar_nas, aslan_ner...) хийдэг байсан бол — зургаан variable, уялдаагүй зургаан нэр; class-тай бол — нэг тодорхойлолт, гурван цэвэрхэн багц: холбоотой өгөгдөл багцаараа явдаг боллоо.
Хоёр дахь жишээ: сүргээ хавтсанд — object-уудын list. Туршилтын "гар барилт" жинхэнэ жүжиг болох цаг:
python
banhar = Nohoi("Банхар", 3)
aslan = Nohoi("Аслан", 7)
tsookhor = Nohoi("Цоохор", 1)
nohoid = [banhar, aslan, tsookhor]
for nohoi in nohoid:
nohoi.hutsah()
print(f"Нийт {len(nohoid)} нохой байна")Үр дүн:
Банхар: Хов хов!
Аслан: Хов хов!
Цоохор: Хов хов!
Нийт 3 нохой байнаnohoid = [banhar, aslan, tsookhor] — object-ууд list-ийн гишүүн боллоо: list "юу ч тээж чадна" гэсэн Бүлэг 10-ын амлалт эцсийн гүнээ хүрэв — тоо, string тээдэг байсан сав чинь таны өөрийн бүтээсэн төрлийн юмсыг тээж байна. Тэгээд loop: for nohoi in nohoid — давталтын variable-д тойрог бүрд дараагийн нохой ирж (нэрлэлтийн олон-ганц хос: nohoid → nohoi!), биед нь nohoi.hutsah() — "одоогийн нохойгоо хуцуул": гурван мөрөн дээр гурав байсан дуудлага хоёр мөр болж, нохой мянга болсон ч энэ хоёр мөр өөрчлөгдөхгүй — Бүлэг 10-ын "код өгөгдлөөсөө салангид" бэлэг object-уудын ертөнцөд бүрэн хүчээрээ ирлээ.
Гурав дахь жишээ: сүргээс шүүх, тоолох — цуглуулгын бүх урлаг object дээр. Loop + if + шинжид хандалт:
python
nohoid = [Nohoi("Банхар", 3), Nohoi("Аслан", 7), Nohoi("Цоохор", 1)]
print("--- Ахимаг насны нохоид (5-аас дээш) ---")
too = 0
for nohoi in nohoid:
if nohoi.nas > 5:
print(f"{nohoi.ner} — {nohoi.nas} настай")
too = too + 1
print(f"Нийт {too} нохой олдлоо")Үр дүн:
--- Ахимаг насны нохоид (5-аас дээш) ---
Аслан — 7 настай
Нийт 1 нохой олдлооХоёр шинэ нюанс. Эхний мөр: object-уудыг variable-д хадгалалгүй шууд list дотор угсарлаа — Nohoi("Банхар", 3) дуудлагын гардуулалт шууд гишүүн болж байна: тус тусын нэр (banhar, aslan...) хэрэггүй болмогц энэ хэлбэр байгалиас цэвэрхэн — сүрэгт нэг нэрээр (nohoid) хандахад хангалттай. Биед нь: nohoi.nas > 5 — давталтын variable-аар дамжуулж шинжид хандаад нөхцөлд шүүж байна: "нөхцөлт тоолуур" хэв маяг (Бүлэг 10) object-ын шинжтэй нийлээд "цуглуулгаас асуулт асуудаг" жинхэнэ өгөгдлийн ажил боллоо — "5-аас өндөр настай хэд байна", "нэр нь Б-ээр эхэлдэг нь хэн бэ": бодит программын өдөр тутмын асуултууд яг ийм гурван мөрөөр хариулагддаг.
Дөрөв дэх жишээ: биелэл бүрийн бие даасан амьдрал. Анкетын "залруулгын" ажиглалтыг кодоор батлая — өчигдрийн tursun_udur method-оо class-даа нэмээд:
python
def tursun_udur(self):
self.nas = self.nas + 1
print(f"{self.ner} {self.nas} нас хүрлээ!")(шигдэлтийг ажигла — hutsah-тайгаа нэг түвшинд, class-ын дотор!) — тэгээд:
python
banhar = Nohoi("Банхар", 3)
aslan = Nohoi("Аслан", 7)
banhar.tursun_udur()
banhar.tursun_udur()
print(f"Банхар: {banhar.nas} настай")
print(f"Аслан: {aslan.nas} настай")Үр дүн:
Банхар 4 нас хүрлээ!
Банхар 5 нас хүрлээ!
Банхар: 5 настай
Аслан: 7 настайБанхар хоёр нас нэмэхэд Аслан хөдөлсөнгүй: method нь self-ээр дамжаад зөвхөн дуудсан object-ынхоо шинжийг өөрчилдөг — биелэл болгон өөрийн "анкеттай", нэгнийх нь залруулга нөгөөд халддаггүй. Энэ бие даасан байдал бол олон-object хэв маягийн аюулгүйн суурь: мянган хэрэглэгчтэй системд нэг хэрэглэгчийн нууц үг солигдоход бусад нь хөндөгддөггүйн учир — хэрэглэгч болгон өөрийн object учраас юм.
Одоо "яагаад энэ хэв маяг чухал вэ" гэдгээ нэг өгүүлбэрт нэгтгэе: бодит ертөнц бол "нэг төрлийн олон юмсаас" бүтдэг — сургууль: олон сурагч; дэлгүүр: олон бараа; тоглоом: олон дүр; чат: олон мессеж — программ бодит ертөнцийг дуурайдаг тул "нэг тодорхойлолт — олон биелэл" хэв маяг хаа сайгүй: та үүнийг эзэмшсэнээр жижиг скрипт бичигчээс систем зохиогчийн сэтгэлгээ рүү шилжих эхний алхмаа хийлээ.
Хүсвэл туршаад үзээрэй: Suragch class (нэр, оноотой) зохиогоод дөрвөн сурагчтай list үүсгэж, дундаж оноог нь тооцоолоорой — хуримтлуулагч + nohoi.nas загварын хандалт: Бүлэг 10-ын дундажийн жишээ object-оор дахин төрнө. Сонирхвол харилцагчийн дэвтрээ санаарай: харилцагч болгон нь үнэндээ Harilzagch(ner, dugaar) object байж болох байсан — dictionary-гаар хийснээ class-аар хийвэл юу өөрчлөгдөхийг бодох нь (заавал бичихгүйгээр!) энэ бүлгийн ойлголтыг бодит төслөөр шалгах сайхан дасгал.
Алдаа 1: Нэг object угсраад олон гэж бодох. Хамгийн гүн ойлголтын алдаа:
python
nohoi = Nohoi("Банхар", 3)
nohoi = Nohoi("Аслан", 7)
print(nohoi.ner)Үр дүн:
АсланБанхар хаачив? Хоёр угсралт болсон нь үнэн — гэхдээ хоёул нэг л нэрэнд (nohoi) хадгалагджээ: хоёр дахь оноолт эхнийхийг дарж бичсэн (Бүлэг 4-ийн мөнхийн дүрэм — object-од ч үйлчилнэ): Банхар нэргүй болж "төөрөв." Олон object-од олон нэр (banhar, aslan) эсвэл — зөв нь — нэг list: угсарсныгаа append хийгээд яв. Оношийн шинж: "сүүлд угсарсан минь л үлдээд байвал" — нэрээ дарж бичээд байгаа эсэхээ шалга.
Алдаа 2: Class-ын нэрээр нь дуудаад олон object "гарна" гэж найдах. Цаас ба конвейерийн андуурал шинэ дүрээр:
python
nohoid = [Nohoi, Nohoi, Nohoi]
for nohoi in nohoid:
nohoi.hutsah()Python:
TypeError: Nohoi.hutsah() missing 1 required positional argument: 'self'List дотор хаалтгүй Nohoi гурвантаа — угсралт болоогүй: хаалтгүй нэр бол "зураг төсөл өөрөө" (function-ий "чимээгүй дурдлага"-ын class-хувилбар): хавтсанд гурван анкет биш — гурван хоосон маягт хийчихэж. Мэдэгдэл нь ч учиртай: цэгийн өмнө object биш class зогссон тул self-ийн суудалд явах "жинхэнэ нохой" олдсонгүй — missing 'self'. Засвар: Nohoi("Банхар", 3) — хаалт + argument: конвейерийг ажиллуул. Онош: missing... 'self' гэсэн мэдэгдэл харагдвал — "object биш class дээр нь method дуудчихаж" гэсэн сэжиг тэргүүнд.
Алдаа 3: Loop дотор шинж уншихдаа давталтын variable-аа мартах. Хоёр нэрийн зөрөг:
python
nohoid = [Nohoi("Банхар", 3), Nohoi("Аслан", 7)]
for nohoi in nohoid:
print(f"{nohoid.ner} — {nohoi.nas} настай")Python:
AttributeError: 'list' object has no attribute 'ner'"list-д ner гэж алга" — мэдэгдлийн эзнийг ажигла: nohoi биш nohoid (үсэг ганцхан зөрсөн — d!): f-string-ийн нүхэнд сүргийн нэр (list) орчихсон — хавтаснаас "нэрийг чинь хэлээч" гэж асуусан хэрэг: хавтас нэргүй, анкетууд нь л нэртэй. Олон-ганц нэрлэлтийн хосын (nohoid/nohoi) "нэг үсгийн ойролцоо" тал ийм зөрөг төрүүлдэг — оношийн түлхүүр нь мэдэгдэлд бэлэн: 'list' object has no attribute гэвэл "гишүүний оронд савыг нь тавьчихаж": нүхнүүдээ давталтын variable-тай тулга.
Нэг class — олон object: угсралт болгонд init шинээр ажиллаж object болгон өөрийн шинжийн утгуудтай мэндэлнэ; method нэг газар бичигдсэн ч дуудлага болгонд "өөрийн" object дээр ажиллана.
Object-ууд list-ийн гишүүн болно: сүрэг = object-уудын list; for + цэгэн хандалт (nohoi.ner) + if = цуглуулгаас асуулт асуудаг өгөгдлийн ажил — нохой мянга болсон ч loop-ын хоёр мөр өөрчлөгдөхгүй.
Биелэл бүр бие даасан: нэгнийх нь шинж өөрчлөгдөхөд бусад нь үл хөндөгдөнө — олон хэрэглэгчтэй системүүдийн аюулгүйн суурь.
"Нэг тодорхойлолт — олон биелэл" бол бодит ертөнцийг дуурайдаг программын үндсэн хэв маяг: сурагчид, бараанууд, тоглоомын дүрүүд — бүгд ийм бүтэцтэй.
Гурван онош: "сүүлчийнх нь л үлддэг" — нэг нэрэн дээр дарж бичив; missing 'self' — хаалтгүй class дээр method дуудав; 'list' has no attribute — гишүүний оронд савыг тавив.
Ингээд Class ба Object бүлэг өндөрлөлөө — энэ сургалтын хамгийн хийсвэр өндөрлөгийг та давлаа: одоо таны нүдэнд Python бүхэлдээ өөр харагдах учиртай — бүх утга object, бүх цэг self-ийн зам, бүх "авдар" class-ын бэлэг. Өмнө чинь сүүлчийн бүлэг үлдлээ: Төгсгөл ба цаашид — эхлээд энэ сургалтын сүүлчийн хамтын барилга: чулуу-цаас-хайч тоглоом — random, function, loop, dictionary бүгд нэг тавцан дээр; дараа нь "эндээс хаашаа явах вэ" гэсэн замын зураг; тэгээд баяр хүргэх үг. Төгсгөлийн шулуунд орлоо — урам нэмээд ирээрэй.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.