1-sahifa 2-sahifa
Sinf namunasini yaratish
Download 363.98 Kb.
|
Python
- Bu sahifa navigatsiya:
- 202-sahifa 202
- 203-sahifa 21.3. Sinf namunasini yaratish 203
- 205-bet 21.5. Lahzani tahlil qilish 205
- 21.5. Lahzani tahlil qilish
- 21.6. Shaxsiy va xavfsiz kirish
- 207-sahifa 21.7. Mehmonlar oqimini taqlid qiladigan oddiy dastur 207
- 21.7. Oddiy simulyatsiya dasturi tashrif buyuruvchilar oqimi
- 209-bet 21.9. Mashqlar 209
- 211-sahifa 22 Subklassing
- 212-sahifa 212
- 213-sahifa Subklassing 213
- 22.1. Sanoq toxtashlari
- 215-sahifa 22.2. juda zor 215
21.3. Sinf namunasini yaratish Shunday qilib, siz liftdagi stulni modellashtirish sinfini aniqladingiz va Siz ushbu sinf misollarini yaratishingiz mumkin . Kreslolar sinfini taqqoslash mumkin zavod bilan: u buyumlarning blankalarini oladi va ularni ob'ektlarga aylantiradi kreslolar.
202 21-bob. Sinflar Xususan, ushbu muammo dizayn usuli bilan hal qilinadi pa __init__ . Birinchi parametr minimal o'zini o'zi ob'ektni , ya'ni "ish qismi". Python __class__ atributini ob'ektga tayinlaydi ( konstruktorga berishdan oldin kafedra sinfini chaqirish ). Ehtimol, boshqa o'xshashlik sizga qanday ishlashini yaxshiroq tushunishga yordam beradi. darslar: multfilmlar bolalarning tug'ilishini qanday tasvirlayotganini eslang. Tug'ilmagan bolalar bulutlarning bir qismida yashaydilar. Bir yaxshi lahza laxta ichkariga kiradi, bolani bulutdan olib beshikka uzatadi ota-onalar uyida. Konstruktorni chaqirganda, Python bolani oladi - bulutdan ka (ob'ektni oladi). Bolani uyga olib boradi, uni qiladi oila a'zosi (tayinlash __class__ xususiyati qiymatini Kafedra yoki boshqa sinfingizga mos keladigan qiymat). Bola qachon bo'ladi uyda, uni qo'yish mumkin, yuvish mumkin va hokazo operatsiyalar orqali o'zgarishi mumkin bo'lgan holat. Quyida Python-dagi 21-sonli kafedrani yaratish uchun kod mavjud. Da sinfni chaqirish (ya'ni sinf nomini qavslar bilan belgilash) sizni Pythonga konstruktorni chaqirishni ayting. Undan farqli o'laroq Python-dagi ba'zi tillar yangi kalit so'zni ishlatishi shart emas yoki turini ko'rsating; shunchaki parametrlari bo'lgan qavslarni qo'ying sinf nomi keyin konstruktor: >>> stul = Kafedra (21) Biz yana bir bor terminologiyaga aniqlik kiritamiz: stul o'zgaruvchisi ob'ektga ishora qiladi, ya'ni namuna. U sinfni ko'rsatmaydi. Ob'ekt sinfga tegishli Kafedra . Namuna bir qator atributlarni o'z ichiga oladi, shu jumladan hisoblash va id . Inventsiya atributiga kirish uchun uning namunasini ko'rsating ( stul ): >>> kafedra 0 >>> kafedra mudiri 21 Python ma'lum atributlarni qidirish ierarxiyasidan foydalanadi. Birinchidan- la Python misolda atribut qidiradi. Agar qidirish amalga oshmasa, Aytgancha, Python sinfda atribut izlashni davom ettiradi (bu holatlardan beri) qaysi sinfga tegishli ekanligini bilish). Agar bu safar qidiruv bo'lsa
21.3. Sinf namunasini yaratish 203 muvaffaqiyatsiz bo'ladi, Python AttributeError (atributini tashlaydi) yo'qolgan). Max_occupants atributi odatda sinfda saqlanadi, lekin unga shuningdek, misol orqali kirish mumkin: >>> kafedra.max_occupants 4 Ichki amaliyotda Python ushbu qo'ng'iroqni quyidagiga almashtiradi: >>> kafedra .__ sinf __. max_occupants 4 Sinf fabrika kabi stul = stul (21) Kod
Kompyuter nima qiladi O'zgaruvchan ob'ektlar Kafedra Id: 1aea
__-sinf __: turi max_occupants yuklaydi ...
Id: 1ca8 __class __: funktsiyasi id hisoblash Id: 1cb2 __-sinf __: Kafedra stul 21
0 Int
4 Int
Anjir. 21.4. Ob'ektni qurish jarayoni. Stork konstruktorini chaqirganda - Python konstruktorga "bola" - ob'ektni (o'zini) olib keladi. Ushbu mulk o'rnatildi. __class__ atributi, lekin konstruktor qo'shib, namunani o'zgartirish huquqiga ega yangi sifatlar. Ob'ekt stulga aylanadi
204 21-bob. Sinflar Atribut qidiruvlari o'zgaruvchan qidiruvlardan farq qiladi. Shuni unutmang Python mahalliy miqyosdagi o'zgaruvchilarni qidirishni boshlaydi, keyin global miqyosga, so'ngra o'rnatilgan - va qidiruv natija bermasa, natijada NameErrorni tashlaydi . Qidirmoq atributlar misol bilan boshlanadi, keyin sinfga o'tadi va agar atribut topilmadi, AttributeError tashlanadi . 21.4. Qo'ng'iroq usuli Agar sizda sinf namunasi bo'lsa, unda siz usullarni chaqirishingiz mumkin. Usullar kabi funktsiyalar, qavslar yordamida chaqiriladi dalillar keltirilgan. Quyidagi misol usulni chaqiradi kafedraga uchta chang'ichini qo'shish: >>> kafedra yuklamasi (3) Qo'ng'iroq usulining sintaksisini qisqacha ko'rib chiqing. Avval ekzema ko'rsatiladi. a kafedrasi bir davrda tomonidan ta'qib. Python-dagi nuqta qidirish uchun mo'ljallangan atribut (agar u sonli tom ma'noda kelmasa). Qachon misolni nuqta bilan ta'qib qilayotganingizni ko'rasiz, Python xohlaganligini unutmang nuqtai nazardan keyin nima kelishini qidiring. Birinchidan, Python instansiyadagi yuklarni qidiradi . Ushbu atributni misolda toping. bajarilmadi (misol uchun konstruktorga tayinlanganligini eslang faqat atributlar soni va id ). Biroq, misol shuningdek o'z ichiga oladi sinfingizga bog'lang. Instantsiya bo'yicha qidiruv muvaffaqiyatsiz bo'lgani uchun, Python ushbu atributlarni sinfda qidirishda davom etmoqda. .Load usuli aniqlaydi kafedrasi sinfi uchun bo'linadi , shuning uchun Python uni qaytaradi. Dumaloq qavs usul qo'ng'iroqni ko'rsating va 3 raqami parametr parametrida uzatiladi. Yuk deklaratsiyasi qanday ko'rinishini eslang : ... def yuki (o'zini, raqamini): # 6 ... self.count + = raqam Deklaratsiyada ikkita parametr ko'rsatiladi, o'z-o'zidan va raqam , va ular chaqirilganda, faqat bitta parametr berilgan 3. Nima uchun parametrlar soni mos kelmaydi tushadi? O'z- o'zidan parametr namunani ( bu holda stul ) anglatadi. Python chaqiradi .load usuli o'tib, stul ham o'zini parametr Tinch Okeani va 3
21.5. Lahzani tahlil qilish 205 raqam parametrlari . Aslida, Python u bilan bog'liq bo'lgan barcha muammolarga g'amxo'rlik qiladi o'zi parametr bilan ishlaydi va uni avtomatik ravishda uzatadi.
Ko'rish qo'ng'irog'idan foydalanganda stul yuklamasi (3), ichki amalga oshirishda, quyidagi shaklda qo'ng'iroq ishlatiladi: Kafedra yuklamasi (stul, 3). Siz ushbu usulni sinab ko'rishingiz va uning ishlashiga ishonch hosil qilishingiz mumkin, ammo Bu amalda tavsiya etilmaydi, chunki bunday kod yomon o'qiladi va ko'proq joy egallaydi. 21.5. Lahzani tahlil qilish Agar sizda misol bo'lsa va uning xususiyatlarini bilishni istasangiz, bor Bir nechta variant. Ma'lumotni hujjatlarda topish mumkin. (agar mavjud bo'lsa). Siz belgilaydigan kodni o'qishingiz mumkin sinf. Va nihoyat, siz uchun mo'ljallangan dir funktsiyasidan foydalanishingiz mumkin Uni siz uchun eshiting: >>> dir (stul) ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'count', 'id', 'load', 'max_occupants', 'tushirish'] Eslatib o'tamiz, dir funktsiyasi ob'ektning atributlarini ro'yxatga oladi. Burilish orqali Dir hujjatiga murojaat qilsangiz, yuqorida ko'rsatilgan narsalar aniqlanganligini ko'rasiz Dir, deb butunlay to'g'ri emas. Hujjatlar shunday deydi: "... alfavit bo'yicha tartiblangan ismlarning ro'yxatini, shu jumladan o'z ichiga oladi (ba'zi) berilgan ob'ektning atributlari, shuningdek mavjud atributlar
yordam (dir) (bizning tanlovimiz)
206 21-bob. Sinflar Funktsiya ob'ektdan mavjud bo'lgan atributlarni namoyish etadi. Haqiqiy shart Masalan, __dict__ atributida , bog'laydigan lug'atda saqlanadi atributlar qiymatlari bilan nomlar: >>> kafedra .__ dikt__ {'count': 3, 'id': 21} Shunday qilib, misol uchun, faqat hisoblangan va id atributlari saqlanadi , va boshqa atributlar sinf orqali mavjud. Sinf qayerda saqlanadi? __Class__ atributida : >>> kafedra .__ sinf__
Sinov o'z sinfini bilishi juda muhim, chunki sinf saqlanadi sinf usullari va xususiyatlari.
Ba'zi tillarda xususiy sifatlar tushunchasi mavjud va todes. Ushbu usullar haqiqat tafsilotlari deb taxmin qilinadi oxirgi foydalanuvchilar tomonidan chaqirilmasligi kerak. Bundan tashqari dasturlash tili ularga kirishni blokirovka qilishi mumkin. Python foydalanuvchilarni bezovta qilmoqchi emas. Taxminlar Siz katta yoshli odamsiz va sizning harakatlaringiz uchun javobgar bo'lishga ishonasiz. Agar biror narsaga kirishni xohlasangiz, uni amalga oshirishingiz mumkin. Biroq, oqibatlarini qabul qilishga tayyor bo'ling. Python dasturchilari ob'ekt qulay bo'lishi mumkinligini tushunishadi saqlash holati va amalga oshirish tafsilotlari bo'lgan usullar. Shunday qilib, oxirgi foydalanuvchi ushbu komponentlar emasligini tushunadi um tutqichi, ularning ismlari pastki chiziq bilan boshlanadi. Quyida yordamchi usul bilan sinf ._ oldindan belgilanmagan, tekshiriladi. hamma qo'ng'iroq qilish uchun tayinlangan: >>> sinf CorrectChair: ... '' 'Kafedrada stul' '' ... max_occupants = 4
21.7. Mehmonlar oqimini taqlid qiladigan oddiy dastur 207 ...
... def __init __ (o'zini, id): ...
self.id = id ...
self.count = 0 ...
... def yuki (o'zini, raqamini): ...
yangi_val = o'z-o'zini tekshirish (self.count + number) ...
self.count = yangi_val ...
... def tushirish (o'zim, raqam): ...
new_val = self._check (self.count - number) ...
self.count = yangi_val ...
... def _check (o'z-o'zidan, raqam): ...
agar <0 yoki raqam> self.max_occupants: ...
oshirish ValueError ('Noto'g'ri hisoblash: {}' formati ( ...
raqam)) ...
qaytarish raqami ._Check usuli shaxsiy hisoblanadi - faqat unga kirish kerak misollar. Xususiy usullar .load va .unload metodlari bilan chaqiriladi sinf. Agar xohlasangiz, ularni sinfdan tashqarida qo'ng'iroq qilishingiz mumkin. Yo'q buni kamroq qilish kerak emas - belgi bilan chizilgan barcha tarkibiy qismlar Raqamlar yo'q bo'lishi mumkin bo'lgan amalga oshirish tafsilotlari hisoblanadi. sinfning kelajakdagi versiyalarida.
Biz tog'da chang'ichilar oqimini taqlid qilish uchun sinfdan foydalanamiz chang'i kurorti. Biz bir qator asosiy taxminlarni qilamiz - masalan, bu haqida har bir o'rindiq 0 dan max_occupantsgacha teng imkoniyatga ega chang'ichilar. Sinf liftni yoqadi, yuklaydi va ichkarida ishlaydi yakuniy tsikl. Sekundiga to'rt marta joriy statistika ko'rsatiladi: tasodifiy import import vaqti sinf CorrectChair: '' 'Kafedrada stul' '' max_occupants = 4
208 21-bob. Sinflar def __init __ (o'zi, id): self.id = id self.count = 0 def yuki (o'zini, raqamini): yangi_val = o'z-o'zini tekshirish (self.count + number) self.count = yangi_val def tushirish (o'zini, raqam): new_val = self._check (self.count - number) self.count = yangi_val def _check (o'z-o'zidan, raqam): agar <0 yoki raqam> self.max_occupants: oshirish ValueError ('Noto'g'ri hisoblash: {}' formati ( raqam)) qaytarish raqami NUM_CHAIRS = 100 stullar = [] diapazondagi raqamlar uchun (1, NUM_CHAIRS + 1): stul.append (CorrectChair (num)) def avg (stullar): jami = 0
stullar uchun c: jami + = c.count orqaga qaytish / len (stullar) in_use = [] tashilgan = 0 haqiqat:
# yuk yuklash = stullar.pop (0) in_use.append (yuklanmoqda) in_use [-1] .load (tasodifiy.randint (0, CorrectChair.max_occupants)) # tushirish agar len (in_use)> NUM_CHAIRS / 2: yuklash = in_use.pop (0) tashildi + = tushirish.ko'lam tushirish (yuklash) stullar qo'shish (tushirish)
21.9. Mashqlar 209 chop etish ('Yuklash stul {} soni: {} o'rtacha: {:. 2} jami: {}'. format (loading.id, yuklash. son, o'rtacha (in_use), tashilgan)) vaqt.xotira (.25) Ushbu dastur cheksiz chang'ichilar sonini ko'rsatadi ko'taring. Ma'lumotlar terminalga chiqariladi, ammo bosib chiqarish funktsiyasi mumkin CSV fayliga ma'lumotlarni chiqarish uchun kod bilan almashtiriladi. Faqat ikkita raqamni o'zgartirib (global qiymat NUM_CHAIRS va atributlar sinfi) sa CorrectChair.max_occupants ), siz modelning xatti-harakatlarini o'zgartirishingiz mumkin kattaroq yoki kichikroq ko'tarishni taqlid qilish uchun. Qo'ng'iroqlar tasodifiy. randintni aniqroq aks ettiradigan funktsiya bilan almashtirish mumkin yuk taqsimoti. 21,8. Xulosa Ushbu bobda sinflar batafsilroq muhokama qilindi. Biz muhokama qildik sinflar bilan bog'liq atamalar. Siz "ob'ekt" yoki aytishingiz mumkin "Instans"; bu atamalarni sinonim deb hisoblash mumkin. Har bir ob'ekt ba'zi sinf bilan bog'liq. Sinf - bu qandaydir zavod, men aniqlayman ob'ektlar / holatlarning umumiy harakati. Ob'ekt qurilish deb ataladigan maxsus usul bilan yaratiladi. torus. Ushbu usul __init__ deb nomlangan . siz ham qila olasiz O'zingizning sinf usullaringizni aniqlang. Sinfni yaratishda ehtiyotkorlik bilan o'ylash kerak. Nima sinfda atributlar bo'lishi kerakmi? Agar xususiyat doimiy bo'lib qolsa barcha ob'ektlar uchun uni sinfda aniqlang. Agar atribut o'ziga xos bo'lsa ob'ekt, uni konstruktorga o'rnating.
1. Tasavvur qiling, siz bank uchun ariza tayyorlaysiz. Qanday mijoz modeli ko'rinishi kerakmi? U qanday fazilatlarga ega bo'lishi kerak egalik qilmoq U qaysi usullarni qo'llab-quvvatlashi kerak? 2. Super Mario seriyasidan o'yin yaratyapsiz deb tasavvur qiling. Zarur Mario o'yinining qahramonini ifodalaydigan sinfni aniqlang. Qanday qilib u
210 21-bob. Sinflar bolalarga o'xshaydimi? Agar siz Super Mario o'yinlari bilan tanish bo'lsangiz, moda uchun sevimli video yoki stol o'yinidan foydalaning lirovany o'yinchi. 3. Tvitlarni simulyatsiya qilish uchun sinf yarating ("Tvit- re "). Agar Twitter nima ekanligini bilmasangiz, Vikipediyada, quyidagi ta'rif 1 ishlatiladi : “[...] uchun ijtimoiy tarmoq veb-interfeys, SMS, tezkor xabarlar yoki uchinchi tomon vositalari Gram mijozlari har qanday yoshdagi Internet foydalanuvchilari uchun. " 4. Uy anjomlarini modellashtirish uchun sinf yarating ( o'chiriladi, kir yuvish mashinasi, muzlatgich va boshqalar). 1 https://ru.wikipedia.org/wiki/Twitter
22 Subklassing Guruhlash holati va operatsiyalardan tashqari, sinflar ham mavjud kodni qayta ishlatish. Agar sizda allaqachon sinf bo'lsa va sizga kerak bo'lsa uning xatti-harakatlaridan bir oz farq qiladigan boshqa sinf, usullardan biri Qayta foydalanish xususiyati subklassing . Sinf qaysi subklassing amalga oshirilayotganiga superklass deyiladi (Yana bir keng tarqalgan superklass nomi ota-ona sinfidir ). Aytaylik, siz oltitani ushlab turadigan stulni yaratmoqchisiz chang'ichilar. Kafedrani simulyatsiya qiladigan kafedra 6 sinfini yaratish olti kishi - kafedraning yanada ixtisoslashgan versiyasi , siz qila olasiz subklassingdan foydalaning. Subklasslar dasturchiga ruxsat beradi ota-onalar sinflari usullarini meros qilib olish va ularni bekor qilish usullari, o'zgartirish kerak. Quyida bo'lgan Chair6 sinf bir sinf bo'lib, CorrectChair : >>> sinf kafedrasi6 (To'g'riChair): ... max_occupants = 6 Shuni yodda tuting: ota-sinf CorrectChair emas sinf nomidan keyin qavslar. E'tibor bering, kafedra6 belgilamaydi tanangizdagi konstruktor, ammo siz sinfni yaratishingiz mumkin: >>> oltita = stul6 (76) Agar sinfda hech qanday konstruktor aniqlanmasa, Python qanday qilib ob'ektni yaratadi? Bu yerda nima bo'ladi: Python .__ ташабб__ usulini qidirganda qidirish boshlanadi
212 22-bob. Subklassing Subklasslar sinf kafedrasi6 (To'g'riChair): max_occupants = 6 Kod
Kompyuter nima qiladi To'g'riChair Id: 1aea __-sinf __: turi max_occupants __init__
... Id: 1ca8
__class __: funktsiyasi Kafedra6
6 Int
4 Int
Id: 1ce4 __-sinf __: turi max_occupants __bazlar__ Id: 1cb2 __class __: tuple (,)
ota-onalar sinflari sizga aniqlangan atributlarni qidirishga imkon beradi xop. Agar atribut quyi sinf misolida aniqlansa, u holda bu xususiyat. Agar yo'q bo'lsa, unda misoldan keyin qidirish sinfda davom etadi (__class__) misol. Agar ushbu urinish ham bajarilmasa, qidiruv amalga oshiriladi ota-onalar sinflarida (__ bazalar__)
Subklassing 213 Subklasslar olti = Kafedra6 (76) Kod
Kompyuter nima qiladi To'g'riChair Id: 1aea __-sinf __: turi max_occupants __init__
... Id: 1ca8
__class __: funktsiyasi Kafedra6
olti 6 Int 4 Int
Id: 1ce4 Id: 1cf1
Id Hisoblang max_occupants __bazlar__ Id: 1cb2 __class __: tuple __-sinf __: turi __-sinf __: Kafedra6 (,) Int
0 76 Int Anjir. 22.2. Subklass namunasini yarating. Eslatma: misol o'z sinfiga ko'rsatgichni o'z ichiga oladi va sinf ko'rsatgichlarni o'z ichiga oladi barcha ota-onalar sinflariga (atribut __ bazalari__)
214 22-bob. Subklassing bilan Chair6 . Kafedra6 sinfida faqat max_occupants atributi mavjudligi sababli , Python bu erda .__ ташабб__ usulini topa olmaydi . Lekin beri Chair6 emas CorrectChair subklassida ro'yxatdagi __bases__ atributi mavjud tayanch sinflar ko'paytmaga qisqartirildi: >>> Kafedra6 .__ asoslari__ (__ kun __. To'g'riChair,) Keyin Python asosiy sinflarda konstruktorni qidiradi. U qurilishni topadi CorrueChair-dagi torus va undan yangi sinf yaratish uchun foydalanadi. Xuddi shu izlash . Misol uchun .load ni chaqirganda ham sodir bo'ladi . Egzamada usul nomiga mos keladigan biron bir atribut yo'q, shuning uchun Python misol sinfini tekshiradi. In Chair6 ham hech usuli .load shunday, Python CorrectChair asosiy sinfida atribut qidiradi . Bu erda .load usuli haddan tashqari qiymat bilan chaqirilgan, bu xatoga olib keladi QiymatError : >>> yuklash (7) Traceback (eng so'nggi qo'ng'iroq oxirgi): Fayl "/tmp/chair.py", 30-qator, oltitalik (7) "/Tmp/chair.py" fayli, 13-qator, yuk ostida yangi_val = o'z-o'zini tekshirish (self.count + number) "/Tmp/chair.py" fayl, 23-qator, _check-da raqam))
ValueError: Noto'g'ri hisoblash: 7 Python bazasi sinfda bir usul, lekin usuli chaqiruv ._check privo- ValueError xatosiga olib keladi .
Ba'zan chang'ichi liftni to'g'ri bajara olmaydi. Bunday Agar operator ko'tarishni sekinlashtirsa yoki to'xtatsa, chang'ichiga yordam berish. Yaratish uchun Python-dan foydalanishimiz mumkin bunday bekatlar sonini hisoblaydigan yangi sinf. Aytaylik, yuklash uchun har bir qo'ng'iroq funktsiyani chaqiradi , bu to'xtash yoki mantiqiy alomatni qaytaradi
22.2. juda zo'r 215 yo'q. Chang'ichlar soni va ob'ekt funktsiya parametrlariga o'tkaziladi kreslolar. Quyidagi konstruktsiyada is_stalled funktsiyani oladigan sinf. yirtib tashladi. Bu funktsiya har safar chaqiriladi .load deyiladi : >>> sinf StallChair (To'g'riChair): ... def __init __ (o'zi, id, o'rnatildi): ...
super () .__ tashabbus __ (id) ...
self.is_stalled = is_stalled ...
self.stalls = 0 ...
... def yuki (o'zini, raqamini): ...
agar self.is_stalled bo'lsa (raqam, o'zi): ...
self.stalls + = 1 ...
super (). yuk (raqam) Ushbu sinf misolini yaratish uchun siz funktsiyani taqdim etishingiz kerak yozildi is_stalled . Quyidagi oddiy funktsiya to'xtashlarni keltirib chiqaradi 10% hollarda: >>> tasodifiy import >>> def ten_percent (soni, stul): ... "" "Haqiqiy 10% vaqtni qaytaring" "" ... random.random () <.1 ni qaytaring Endi siz bildirib, bir misol yaratishingiz mumkin ten_percent vazifasini sifatida sozlangan parametr : >>> stall42 = StallChair (42, o'n foiz)
Download 363.98 Kb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling