1-sahifa 2-sahifa
Download 363.98 Kb.
|
Python
- Bu sahifa navigatsiya:
- 216-sahifa 216
- 217-sahifa 22.3. Xulosa 217
- 218-sahifa 218
- 219-bet 23 istisnolar
- 23.1. "Otishdan oldin qarang"
- 221-bet 23.2. "Ruxsatdan kora kechirim sorash osonroq" 221
- 23.2. “Kechirim sorash oson, ruxsatlardan kora "
- 223-bet 23.3. Bir nechta mumkin bolgan istisnolar 223
- 23.3. Bir nechta mumkin bolgan istisnolar
- 225-bet 23.4. nihoyat 225 ESLATMA
- 227-bet 23.5. Boshqa bolim 227
22.2. juda zo'r Eslatib o'tamiz, StallChair o'z belgilaydi .__ init__ usuli , misol yaratilganda deyiladi. Eslatma: Konstruktorning birinchi qatori quyidagicha: super () .__ tashabbus __ (id) Usul ichida super qo'ng'iroq qilsangiz , siz to'g'ri ma'lumotga ega bo'lasiz ota-sinf. Konstruktor ichidagi chiziq qo'ng'iroq qilishga imkon beradi struktor CorrectChair . Takrorlash mantig'ini takrorlash o'rniga
216 22-bob. Subklassing Subklasslar Kod
Kompyuter nima qiladi To'g'riChair Stolchair sinf StallChair (CorrectChair): 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) Id: 1aea __-sinf __: turi max_occupants __init__
... Id: 1ca8
__class __: funktsiyasi 4 Int Id: 1ce4 Id: 1cfa
__bazlar__ __init__
yuklamoq Id: 1cb2
__class __: tuple __-sinf __: turi __class __: funktsiyasi Id: 1cff
__class __: funktsiyasi (,)
Anjir. 22.3. O'zgartirilgan usullar bilan subklassni yaratish kodi. Eslatma ota-sinf usulini chaqirish uchun super () dan foydalanish. Diagramma bir sinf yaratishda qaysi ob'ektlar yaratilishini ko'rsatadi kichik sinf
22.3. Xulosa 217 id va atributlarni sanab , siz ota-onalarning mantig'idan foydalanishingiz mumkin sinf. Yildan StallChair qo'shimcha xususiyatlarga ega bo'ladi, deb misol uchun sozlangan bo'lishi kerak, bu qo'ng'iroqdan keyin amalga oshirilishi mumkin telskiy dizayner. .Load metodi super-ga qo'ng'iroqni ham o'z ichiga oladi : def yuki (o'zini, raqamini): agar self.is_stalled bo'lsa (raqam, o'zi): self.stalls + = 1 super (). yuk (raqam) .Load usulida siz aniqlash uchun is_stalled funktsiyasini chaqirasiz ko'tarishni to'xtatdi va keyin boshqaruvni asl holatiga o'tkazdi funksiya . super yordamida CorrectChair- ni yuklash . Umumiy kodni bir joyda (bazaviy sinfda) joylashtirish kamayadi xatolar soni va kodlarning ko'payishi.
Super kalit so'z ayniqsa ikkita holatda foydalidir. Birinchidan, qachon bir nechta ota-onalar bilan darslarda usullarni hal qilish tartibini aniqlash lyami super ushbu buyurtmaning mustahkamligini ta'minlaydi. Ikkinchidan, qachon super tayanch klassi o'zgarishi yangi bazani mustaqil ravishda belgilaydi sinf, va bu kodlarga xizmat ko'rsatishni soddalashtiradi. 22.3. Xulosa Ushbu bobda yangi ixtisoslashgan kichik sinflar ko'rib chiqiladi o'zlarining asosiy sinflaridan kodni ishlatadigan sinflar (shuningdek, deyiladi) superklasslar yoki ota-onalar sinflari). Har qanday usul uchun emas, balki kichik sinfda amalga oshirilgan bo'lsa, Python funktsional imkoniyatlardan foydalanadi tel-sinf. Usulni amalga oshirishda siz bekor qilishingiz mumkin to'liq yoki super qo'ng'iroqni yoqing . Siz super qo'ng'iroq qilsangiz, siz yarimsiz tarkibidan foydalanish uchun siz ota-sinfga kirasiz u funksionallikka ega.
218 22-bob. Subklassing 22.4. Mashqlar 1. Mushukni ifodalovchi sinfni yarating. Mushuk nima qila oladi? U qanday xususiyatlarga ega? Oldindan mushuk subklassini yarating yo'lbars Subklassning xatti-harakati qanday o'zgaradi? 2. Oldingi bobda siz Mario vakili bo'lgan sinfni yaratdingiz Super Mario Brothers video o'yinidan. O'yinning so'nggi nashrlarida boshqa belgilar uchun o'ynashi mumkin. Ularning barchasi o'xshash edi asosiy funktsionallik 1 , lekin turli xil qobiliyatlar. Belgini ifodalovchi asosiy sinfni yarating, keyin to'rtta kichik sinflarni - Mario, Luidji, Tod va Prin uchun cessa.
Tezlik
4 3 5 2 O'tmoq
4 5 2 3 Quvvat
4 3 5 2 Maxsus mahorat Havoda kursorni ko'taring 1 https://www.mariowiki.com/Super_Mario_Bros._2# O'ynab bo'ladigan_harakterlar
23 istisnolar Kompyuterga o'zi bajaradigan ishni bajarish uchun buyruq berish mumkin tugata olmaydi, masalan, mavjud bo'lmagan faylni o'qing yoki nolga bo'lish. Python sizga bunday istisnolarni bajarishga imkon beradi. dasturda yuzaga keladigan muhim vaziyatlar. Bunday hollarda Python
Odatda, istisno qilinganida, Python voz kechadi va siz qaerni aniqlashingiz mumkin bo'lgan stak izini ko'rsatadi lekin muammo bor edi. Stek izi chiziq va faylni ko'rsatadi xatolar: >>> 3/0
Traceback (eng so'nggi qo'ng'iroq oxirgi): Fayl " ZeroDivisionError: nolga bo'lish Ushbu izdan, tarjimon) nolga bo'linishda xato yuz berdi. Qachon paydo bo'ladi Stack iz dasturini bajarish paytida istisnolar mavjud. Muammo qaysi faylda va qaysi qatorda paydo bo'lganligini ko'rsatadi. Iqtibos qilingan tarjimon bilan namuna ayniqsa foydali emas, chunki dastur kodning bitta satridan iborat. Biroq, katta dasturlarda ko'p darajali stack iz ierarxiyasi, chunki mumkin funktsiyalari boshqa funktsiyalar va usullarni chaqiradi.
220 23-bob. Istisnolar Fayl quyidagi kodni o'z ichiga oladi deylik. def err (): 1/0 def start (): ortga qaytish () def o'rta (): qaytish ko'proq () def more (): adash () Uni bajarishga harakat qilganingizda, siz quyidagi izlarni olasiz: Traceback (eng so'nggi qo'ng'iroq oxirgi): Fayl "/tmp/err.py", 13-qator, start () "/Tmp/err.py" fayli, 5-qator, boshida ortga qaytish () "/Tmp/err.py" fayli, 8-qator, o'rtada qaytish ko'proq () "/Tmp/err.py" fayli, 11-qator, ko'proq adash () "/Tmp/err.py" fayli, 2-qator, xato 1/0 ZeroDivisionError: nolga bo'lish Izlarni teskari yo'nalishda o'qish oson: pastda, xatoni toping va qaerda sodir bo'lganligini ko'ring. Da siz yuqoriga ko'tarilgan izni yuqoriga ko'tarib qo'ng'iroq zanjiri. Bu sizning ichingizda nima bo'layotganini aniqlashga yordam beradi dasturlari.
Sizda bo'linishni amalga oshiradigan dasturingiz bor deylik. Kod qanday yozilganiga qarab, bir muncha vaqt bo'lishi mumkin nolga bo'lishga harakat qiling. Odatda dasturchilar murojaat qilishadi
23.2. "Ruxsatdan ko'ra kechirim so'rash osonroq" 221 istisnolar bilan ishlashning ikki uslubi. Birinchi uslub LBYL deb nomlanadi (Qarang Siz sakrashdan oldin, ya'ni "sakrashdan oldin qarang"). Uning mohiyati bajarishdan oldin istisnolarni tekshirish harakatlar. Bizning holatda, dastur bo'linuvchini nol bilan tekshiradi. Agar bo'linuvchi nolga teng, dastur bo'linishni amalga oshirishi mumkin; agar yo'q - operatsiyani o'tkazib yuboring. Python, LBYL uslubi yordamida amalga oshirilishi mumkin , agar buyruqlar : >>> hisoblagich = 10 >>> bo'linuvchi = 0 >>> agar bo'linuvchi bo'lsa! = 0: ... natija = hisoblagich / bo'luvchi ... yana: ... natija = Yo'q ESLATMA LBYL printsipi muvaffaqiyatni kafolatlamaydi. Agar siz ushbu faylni tekshirsangiz ham uni ochishdan oldin mavjud, bu u bo'ladi degani emas keyinroq Ko'p tishli muhitda bu holat shart deb ataladi irq (poyga holati). ESLATMA None qiymati aniqlanmagan holatni ko'rsatish uchun ishlatiladi. Bu Python dunyosida keng tarqalgan idiomlardan biridir. Ehtiyot bo'ling qiymat berilgan o'zgaruvchiga qo'ng'iroq usullarini sinab ko'ring Yo'q - bu istisno qiladi.
Boshqa istisno bilan ishlov berish uslubi odatda qisqartirish bilan ko'rsatiladi EAFP (ruxsat berishdan ko'ra kechirim so'rash osonroq, ya'ni. Kechirimdan ko'ra kechirish ”. Agar operatsiya bajarilmasa, istisno istisno blokida ushlanib qoladi . "Konstruktsiyadan tashqari ... urinish" ushlash mexanizmini ta'minlaydi Python-dagi asosiy holatlar:
222 23-bob. Istisnolar >>> hisoblagich = 10 >>> bo'linuvchi = 0 >>> sinab ko'ring: ... natija = hisoblagich / bo'luvchi ZeroDivisionError-dan tashqari e: ... natija = Yo'q Ushalar tuzilishi, keyin bir blok yaratadi sinash kalit ko'rsatilgan sifatida ( nuqta va ajratish). Ichkarida sinash blokda buyruqlar deb hisoblanadi istisnolarni tashlashi mumkin. Agar, buyruqlarni bajarishda, lekin istisno uchun Python qidiruvlarni sodir tashqari blokda , kesishadi Tuva - bu istisno (yoki uning ota-onasi sinfidan tashqari). Yuqoridagi kodni yilda tashqari blok bor ushlaydi istisno, ZeroDivisionError sinfining boshqa holatlari (yoki uning kichik sinflari). Qachon belgilangan istisno yuz yilda Ushalar blokda, tashqari blok ijro , va natija None ga o'rnatildi . E'tibor bering: navbatda quyidagicha ZeroDivisionError: oxirgi holatda yo'g'on ichak. Ushbu qism ixtiyoriy: agar bo'lsa mavjud, keyin e (yoki siz tanlagan boshqa o'zgaruvchan nom) ZeroDivisionError istisno misoliga ishora qiladi . Siz .. qila olasiz; siz ... mumkin istisno ob'ektini tahlil qiling, ko'pincha u ko'proq narsani o'z ichiga oladi batafsil ma'lumot. E o'zgaruvchisi faol ekanligini bildiradi nie . Agar e buyrug'ini tashqari buyruq oxiriga qo'shmasangiz , faol dasturda hali ham istisno bo'ladi, lekin siz murojaat qila olmaysiz uning nusxasiga.
Sinash blokining doirasini cheklashga harakat qiling . Ning o'rniga sinab ko'rish blokidagi barcha funktsiyalar kodini, faqat qaysi qatorni o'z ichiga olsangiz xato bo'lishi mumkin. LBYL uslubi xatolarning oldini olish uchun muvaffaqiyatli kafolat bermaydi, Python dasturchilari odatda EAFP uslubini afzal ko'rishadi. Biroz Istisnolardan foydalanishning amaliy qoidalari:
23.3. Bir nechta mumkin bo'lgan istisnolar 223 Errors Boshqarishingiz mumkin bo'lgan xatolarni hal qiling dasturda kutish mumkin. Handle Siz qila olmaydigan istisnolarni bostirmang, va sizning dasturingizda paydo bo'lishi dargumon bo'lganlar. Correctly Dunyo istisnosiz ishlov beruvchidan to'g'ri foydalaning kutilmagan xatolarga ishlov berish.
Agar siz uzluksiz ishlashi kerak bo'lgan server dasturini yozayotgan bo'lsangiz Mumkin usullardan biri quyida ko'rsatilgan ( process_input funktsiyasi ) va log_error mavjud emas va faqat ko'rgazmada taqdim etiladi maqsadlar): vaqt 1:
urinib ko'ring: Natija = process_input () e: kabi istisnolardan tashqari: log_error (e) 23.3. Bir nechta mumkin bo'lgan istisnolar Birdaniga bir nechta istisnolar mavjud bo'lsa Sizning kodi, bir necha ularni sanab tashqari buyruqlar , quyidagi birin ketin: urinib ko'ring: some_function () quyidagicha ZeroDivisionError: # Muayyan bir istisno bilan ishlash e: kabi istisnolardan tashqari: # Boshqa istisnolardan foydalanish Ushbu misolda, some_function istisnolarni qoldirganda , tarjimon birinchi u ZeroDivisionError sinf xatosiga mos keladimi- yo'qligini tekshiradi yoki uning kichik klassi. Agar shart bajarilmasa, kod tekshiriladimi yoki yo'qmi istisno bir istisnoga sublassifikatsiya qilinganmi . Istisno blokiga kirgandan keyin Python endi keyingi bloklarni tekshirmaydi.
224 23-bob. Istisnolar Istisno zanjir tomonidan ishlov berilmagan bo'lsa, uni hal qilish kerak. qo'ng'iroq stakandagi biron bir joyda kod. Istisno malakasiz bo'lib qolsa Shunday qilib, Python ijro etishni to'xtatadi va stack izini bosib chiqaradi. Bir nechta istisnolardan foydalanishning namunasi standartda keltirilgan Kutubxona. Standart kutubxonadan olingan argparse moduli buyruq satri parametrlarini tahlil qilish uchun oddiy mexanizm. U ruxsat beradi ba'zi parametrlarning turini ko'rsating - masalan, butun sonlar yoki fayllar (barcha parametrlar satr shaklida keladi). ._Get_value usulida bo'limlardan tashqari bir nechta foydalanish misollari mavjud . Ichida qo'zg'atadigan istisno turiga qarab farq qiladi xato xabarlari: def _get_value (o'z-o'zidan, harakat, arg_string): type_func = self._registry_get ('type', action.type, action.type) agar qo'ng'iroq qilinmasa (type_func): msg = _ ('% r qo'ng'iroq qilib bo'lmaydi') ArgumentError-ni ko'tarish (amal, msg% type_func) # qiymatni mos turga o'tkazish urinib ko'ring: natija = type_func (arg_string) # ArgumentTypeError - xato belgisi ArgumentTypeError-dan tashqari: name = getattr (action.type, '__name__', repr (action.type)) msg = str (_sys.exc_info () [1]) ArgumentError-ni ko'tarish (amal, msg) # TypeError va ValueErrors ham xatolar belgisidir tashqari (TypeError, ValueError): name = getattr (action.type, '__name__', repr (action.type)) args = {'type': name, 'value': arg_string} msg = _ ('% (turi) ning noto'g'ri qiymati:% (value) r') ArgumentError-ni oshirish (amal, msg% args) # o'zgartirilgan qiymat qaytariladi qaytish natijasi
23.4. nihoyat 225 ESLATMA Ushbu misol buyruqdan boshqa birini ushlab olish mumkinligini ko'rsatmoqda Bir nechta istisnolar turlari mavjud bo'lib, ular uchun klass juftligini o'tkazish kerak istisnolar: tashqari (TypeError, ValueError):
Ushbu misol eski satrlarni formatlash uslubini ham namoyish etadi. % operatoridan foydalanmoqda . Chiziqlar msg = _ ('% (turi) ning noto'g'ri qiymati:% (value) r') ArgumentError-ni oshirish (amal, msg% args) zamonaviy uslubda quyidagicha yozilgan: msg = _ ('yaroqsiz {turi! s} qiymati: {qiymat! r}') ArgumentError-ni ko'tarish (amal, msg.format (** args)) 23.4. nihoyat Yana bir xato bilan ishlaydigan konstruktsiya - bu nihoyat qism . Bu jamoa har doim bajariladigan kodni aniqlash uchun ishlatiladi ha - istisno yuzaga kelgan yoki qilinmaganligidan qat'iy nazar. Oxir-oqibat blok har doim bajariladi. Agar istisno qilingan bo'lsa, keyin nihoyat blok ishlov berilgandan keyin bajariladi. Istisno bo'lmasa ishlov berildi, keyin nihoyat blok bajarildi va istisno tashlandi yana chayqaladi: urinib ko'ring: some_function () e: kabi istisnolardan tashqari: # Xato
nihoyat: # Yakuniy harakatlar
226 23-bob. Istisnolar Odatda, tashqi qismni bo'shatish uchun oxirgi qism ishlatiladi manbalar: fayllar, tarmoq ulanishlari, ma'lumotlar bazalari va boshqalar. Ushbu manbalar operatsiya qilingan yoki qilinmaganligidan qat'i nazar ozod qilinishi kerak muvaffaqiyatli yoki yo'q. Standart kutubxonaning bir qismi bo'lgan timit modulidan misol , oxirgi buyruqning foydaliligini tushunishi mumkin . Timeit moduli ruxsat beradi kod vaqtini bajarish uchun dasturchi. Xususan, davomida vaqtni boshqarish moduli axlat yig'uvchilarni to'xtatishni buyuradi ishlash. Biroq, vaqt tugashi bilan, axlat yig'ish kerak Vaqt tugagan yoki qilinmaganligidan qat'i nazar, uni qayta yoqing muvaffaqiyatli yoki xato yuz berdi. Quyida vaqtni belgilashni bajaradigan timit usuli mavjud. Tekshiradi axlat tozalash vositasi yoqilganmi yoki kerak bo'lsa, uni o'chirib qo'yadi, vaqt kodini olib tashlaydi va nihoyat axlat yig'ilishini qayta faollashtiradi, agar u oldin yoqilgan bo'lsa: def timeit (o'z-o'zidan, raqam = standart_manba): "" "Asosiy buyruqni bajarilish vaqtini hisoblash". Aniqlikni oshirish uchun o'quv buyrug'i bir marta bajariladi, shundan keyin asosiyni ko'p marotaba bajarish uchun vaqt kerak bo'ladi (soniyalarda) haqiqiy raqam sifatida qaytarilgan buyruq. Dalil loop bajarilishining sonini aniqlaydi (asl qiymati bir million). Asosiy buyruq, tayyorlash buyrug'i va ishlatilgan taymer funktsiyasi konstruktorga o'tdi. "" "
it = itertools.repeat (Yo'q, raqam) gcold = gc.isenabled () gc.disable () urinib ko'ring: timing = self.inner (it, self.timer) nihoyat:
agar gcold: gc.enable () qaytish vaqti Self.inner-ga qo'ng'iroq qilganda , istisno yuzaga kelishi mumkin, ammo beri standart kutubxona nihoyat foydalanadi , axlat yig'ish har doim bo'ladi
23.5. Boshqa bo'lim 227 istisnolardan qat'i nazar yoqing (agar mantiqiy bo'lsa) gcold rost).
Ushbu kitobda kontekst menejerlari ko'rib chiqilmaydi, ammo uchun Sizni kelajakdagi Python mutaxassislik karerangizga yo'naltirish uchun sizga bir oz maslahat beramiz. Pythonda sinash / nihoyat kombinatsiyasi "sevgilim" kodi hisoblanadi. Tajribali Python dasturchilari bunday holatlarda kontekst menejeridan foydalanadilar . Ushbu mavzuni o'rganishingiz kerak bo'lgan savollar ro'yxatiga qo'shing. Python-ning asosiy xususiyatlarini o'zlashtirgandan so'ng.
Boshqa urinish buyrug'idagi qo'shimcha bo'lim , agar bajarilsa agar biron bir istisno berilmagan bo'lsa. U kuzatishi kerak bo'limlardan tashqari hamma va oxirgi blokdan oldin bajariladi . Tekislik misol: >>> sinab ko'ring: ... bosib chiqarish ("salom") e: bundan mustasno: ... bosib chiqarish ('Xato') ... yana: ... bosib chiqarish ('Muvaffaqiyat') ... nihoyat: ... bosib chiqarish ('oxirida') salom
Muvaffaqiyat nihoyat
Quyida standart kutubxonaning heapq modulidan misol keltirilgan . Qanday sharhlardan kelib chiqadigan bo'lsak, agar raqam bo'lsa, tezlashtirilgan echim mavjud Talab qilingan qiymatlar uyum hajmidan oshib ketadi. Ammo, agar bo'lsa uyum hajmini olishga urinish kodda xatolikka olib keladi o'tish . Natijada, xato e'tiborga olinmaydi va ijro etish davom etadi sekinroq variant. Agar xato bo'lmasa, siz borishingiz mumkin yana va agar tez yo'lni tanlash n to'p hajmi ekansiz:
Download 363.98 Kb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling