Leksiya 4
Klasslar, obyektlar, vorislik
Masalaning qo'yilishi
Sizning personajingiz - Steve.
Uning: ismi, sog'lig'i, xaritadagi koordinatalari, inventari bor.
Buni qanday dasturlash mumkin?
Birinchi urinish
Bitta o'yinchi - juda yaxshi ishlaydi.
Agar ular 1000 ta bo'lsa-chi?
Bundan tashqari atrofda moblar bor. Va qishloqlar. Va hayvonlar. Nimadir noto'g'ri ketdi.
Yaxshiroq, lekin ideal emas
Allaqachon yaxshiroq. Lekin o'yinchi yurishi, bloklarni buzishi, ovqat yeyishi kerak.
Har safar - lug'atni qabul qiladigan alohida funksiya. Agar kimdir "noto'g'ri" lug'atni uzatsa-chi?
Klass va obyekt
Dasturchilar - dangasa odamlar.
Ular o'ylab topishdi: keling, o'yinchi ma'lumotlari va u nima qila olishini bitta qutiga joylaymiz.
Bu quti klass deb ataladi.
Konsepsiya
Klass - o'yinchi qanday tuzilganining tavsifi.
O'zi hech narsa qilmaydi.
Bu shablon bo'lib, keyinchalik unga ko'ra haqiqiy o'yinchilar yaratiladi.
Konsepsiya
Obyekt - chizmadan tug'ilgan narsa.
Bitta obyekt = o'z ismi va hp si bilan bitta haqiqiy o'yinchi.
Bitta chizmadan istalgancha obyekt yaratish mumkin.
Asosiy fikr
Har biri o'z ma'lumotlari bilan. Chizma esa bitta.
Obyekt nimadan iborat
Bu atributlar - ma'lumotlar.
Bu metodlar - harakatlar.
Butun OOP - shu ikki so'z haqida.
Obyekt nimadan iborat
Atribut - obyektga "yopishtirilgan" o'zgaruvchi.
Har bir obyektning o'z atributlari bor.
Obyekt nimadan iborat
Metod - obyektga "yopishtirilgan" funksiya.
Bitta klassning barcha obyektlari bir xil narsani qila oladi.
Birinchi klassni yaratish
Bu butun klass. Uch qator tana.
Sintaksis
Klass nomi - bosh harf bilan. Bu kelishuv.
Konstruktor
__init__ ning vazifasiBiz Pythonga "o'yinchi yarat" deganimizda, u:
Player chizmasini oladi__init__ orqali o'tkazadi__init__ - initialize so'zidan, "sozlamoq".
self parametri
Chizmani yozayotganimizda, biz aniq bir o'yinchining
ismi nima ekanligini hali bilmaymiz.
self - bu olmosh. Klass ichida "mening, shu aniq o'yinchining" degan ma'noni anglatadi.
self parametri
self - obyektning o'z cho'ntaklariga murojaat qilish usuli.
Birinchi o'yinchini yaratamiz
Nuqta "ning" deb o'qiladi: "Steve ning ismi", "Steve ning hp si".
Ko'plab obyektlar
Bitta chizma - ikkita turli obyekt.
Ko'plab obyektlar
Bu ikkita turli quti. Jismonan turli.
Ko'plab obyektlar
id() - obyektning xotiradagi noyob manzili. is manzil bo'yicha solishtiradi.
Har bir obyektga o'nlab bayt. 1000 o'yinchi ≈ 50 KB - obyektlar arzon.
Ko'plab obyektlar
b = a - nusxa emas, balki o'sha qutining ikkinchi nomi.
Ko'plab obyektlar
Obyektlar bir-biri bilan bog'liq emas.
Birini o'zgartirish boshqalariga ta'sir qilmaydi.
Ko'plab obyektlar
Mingta o'yinchi. Har biri o'z ma'lumotlari bilan.
Hammasi shuning uchun boshlangan edi.
Klass metodlari
Metod - klass ichidagi funksiya. Birinchi parametri har doim self.
Klass metodlari
Nuqta orqali chaqirish. self ni Python o'zi qo'yadi.
Ichki mexanizm
Siz quyidagini yozsangiz
Python ichki tarzda buni quyidagiga aylantiradi
steve avtomatik ravishda self o'rniga tushadi.
Klass metodlari
Qavs ichida faqat amount. self ni Python o'zi qo'yadi.
Klass metodlari
Metod qiymat qaytarishi mumkin - oddiy funksiya kabi.
Klass metodlari
Klass ichida metodlar self orqali erkin muloqot qiladi.
Sehrli metod
__str__: print() ni boshqaramiz__str__ bo'lmaganda siz <__main__.Player object at 0x7f...> ni ko'rgan bo'lardingiz - xotiradagi manzil.
Ikki tagchiziq - Python o'zi chaqiradigan "xizmatchi" metodlar uchun kelishuv.
Standart kutubxonalarda OOP
Har bir nuqta - bu obyektdagi metodni chaqirish.
OOP ni siz birinchi leksiyadan beri ishlatasiz, shunchaki uni shunday atamagansiz.
Misol
Satr - bu str klassining obyekti.
Uning upper metodi bor.
steve.say(...) bilan bir xil narsa. Shunchaki str klassini Python ishlab chiquvchilari yozishgan.
Misol
df - DataFrame klassining obyekti.
Metodlar: head, groupby, describe. Atributlar: shape, columns.
Bizning Player kabi aynan shunday tuzilgan - faqat metodlari yuzlab.
Misol
LinearRegression - klass. model - obyekt. fit/predict - metodlar.
OOP ni tushunganingizda, siz katta kutubxonalar qanday tuzilganini tushunasiz.
Amaliyot #1
name, hp (standart 20), inventory (bo'sh ro'yxat)pickup(item) metodi - inventarga predmet qo'shishhas(item) metodi - predmet bor-yo'qligi__str__ metodi - <Steve> hp: 20, items: 3Amaliyot #1
Xuddi shunday, lekin hayotdan:
owner, balance (standart 0)deposit(amount), withdraw(amount) metodlariO'yin emas - lekin xuddi shunday tuzilgan.
Tahlil
Tanaffus
Keyin: tun keladi, moblar paydo bo'ladi - va biz nima uchun
yuzta o'rniga bitta metod yozishimizni tushunamiz.
Takrorlanish muammosi
Qorong'ulikdan moblar chiqadi:
sekin yuradi va yaqin masofadan uradi
uzoqdan kamondan otadi
jimgina yaqinlashadi va portlaydi
Hammasida umumiy: ism, hp, koordinata, zarar olishi mumkin.
Farqi faqat ular qanday hujum qilishida.
To'g'ridan-to'g'ri yechim
Va Creeper uchun ham xuddi shunday. Yetti qator uch marta nusxalandi.
Nima uchun bunday qilib bo'lmaydi
take_damage da bag topdingiz - Zombie da tuzatdingiz, Skeleton da unutdingizBunday qilmaymiz.
Vorislik
Umumiy narsa - bitta ota-klassga.
Noyob narsa - vorislarga.
Vorislar umumiy narsani avtomatik oladi.
Vorislik
Umumiy qism bitta joyda yig'ilgan.
Vorislik
Zombie(Mob) - "Zombie Mob dan voris bo'ladi". Ichida - faqat yangi malaka.
Bepul nima tegdi
Biz faqat attack ni aniqladik, lekin qolgan hammasi ishlaydi.
__init__ ni kengaytiramiz
super().__init__(name, hp) - "ota qiladigan hamma narsani bajar, keyin men o'zimnikini qo'shaman".
Diqqat
__init__ ni qayta aniqladingiz - birinchi qator super().__init__(...).
So'zlar
parent, bazaviy, superklass
child, vorislar, voris klasslar
Zombie(Mob) yozuvi quyidagicha o'qiladi: "Zombie - bu Mob plyus yana bir narsa".
Qayta aniqlash va polimorfizm
Bir xil metod nomi - turli amalga oshirish.
Qaysi versiyani chaqirish kerak?
Python obyekt turiga qaraydi va kerakli attack versiyasini chaqiradi.
Bitta sikldagi sehr
Siklga ichkarida kim borligi muhim emas. U shunchaki .attack() ni chaqiradi.
Mana shu polimorfizm deb ataladi. G'oyasi oddiy: bitta interfeys, turli xatti-harakat.
Real loyihalarda OOP
Turli modellar - bitta fit/predict interfeysi.
Moblar bilan bo'lgan o'sha sikl.
Bu ham vorislik
ValueError - Exception ning bir turi.
Siz except Exception deb yozsangiz - hammasi ushlanadi, chunki vorislik bor.
Tez-tez uchraydigan xatolar
Atribut faqat self.nom = ... orqali yaratiladi
Tez-tez uchraydigan xatolar
__init__ ni qayta aniqladingiz - birinchi qator super().__init__(...).
Tez-tez uchraydigan xatolar
Ro'yxatlar va lug'atlar - faqat __init__ ichida, klass darajasida emas.
Amaliyot #2
Maynkraftsiz - oddiy misolda usulni mustahkamlaymiz.
Animal(name) va sound() = "..." metodi bilanDog(Animal) sound() = "Vov" ni qayta aniqlaydiCat(Animal) sound() = "Miyov" ni qayta aniqlaydidescribe() metodi: "{name} {sound()} deydi"Tahlil
Zombie/Skeleton/Creeper bilan bo'lgan o'sha usul. O'sha sikl. Shunchaki boshqa ismlar.
Yakunlar
self - klass ichidagi "mening"__str__ - obyekt qanday chop etilishini boshqaramizsuper() - otani chaqirishYakunlar
Siz df.groupby(...) yoki model.fit(...) ni ko'rganingizda, endi buning ichida qanday tuzilganini bilasiz.
Yakun
Telegram: @gokalqurt