1-sahifa 2-sahifa


Download 363.98 Kb.
bet18/21
Sana06.06.2020
Hajmi363.98 Kb.
#115448
1   ...   13   14   15   16   17   18   19   20   21
Bog'liq
Python


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-sahifa

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





217-sahifa

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.

ESLATMA

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-sahifa

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.

Ism

Mario

Luiji

Tod

Malika

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





219-bet

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

uradi, yoki yuksalishning , bir istisno.

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 "", 1-qator, da

ZeroDivisionError: nolga bo'lish

Ushbu izdan,  faylining 1-qatoriga ("fayl" nomi)

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-bet

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, da

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.

23.1. "O'tishdan oldin qarang"

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





221-bet

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.

23.2. “Kechirim so'rash oson,

ruxsatlardan ko'ra "

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-bet

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.

MASLAHAT

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:



223-bet

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.

MASLAHAT

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-bet

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





225-bet

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):

ESLATMA

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-bet

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



227-bet

23.5. Boshqa bo'lim

227

istisnolardan qat'i nazar yoqing (agar mantiqiy bo'lsa)

gcold rost).

ESLATMA

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.

23.5. Boshqa bo'lim

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:



228-bet


Download 363.98 Kb.

Do'stlaringiz bilan baham:
1   ...   13   14   15   16   17   18   19   20   21




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling