Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
1
OOP és Python Vincellér Zoltán
2
Object Oriented Programming
Python rengeteg különböző fajta adatot támogat: Mindegyik egy objektum, és mindegyiknek van: Típusa Belső (adat)reprezentációja (egyszerű vagy összetett) Procedúrák halmaza, amely leírja az interakcióit további objektumokkal Az objektum egy típus példánya 1234 az int példánya „hello” a string egy példánya
3
OOP Pythonban minden objektum (és típusa is van) Lehet:
létrehozni valamilyen típusból új objektumokat manipulálni meglévő objektumokat törölni objektumokat: explicit módon a del használatával vagy ”csak megfeledkezni” róluk, majd a Python megoldja (garbage collection)
4
Mik az objektumok? Adat absztrakciók, amiben rögzíthető:
egy belső reprezentációk adat attribútumokon keresztül egy interfész további objektumokkal való interakcióhoz metódusok (procedúrák/függvények) meghatározzák a működést, de elrejtik az imlementációt
5
Példa: [1,2,3,4] lista Hogy reprezentáljuk egy lista belsejét?
Hogyan lehet manipulálni a listákat? Belső reprezentáció maradjon „elfedve” Helyes működést befolyásolhatja ellenkező esetben
6
OOP előnyei Az adatokat egy csomagba csoportosítjuk olyan metódusokkal, amik ezeket az adatokat tudják manipulálni egy jól definiált interfészen keresztül „Divide-and-conquer” alapú fejlesztés minden osztályt külön kell implementálni és tesztelni növeli a modularitást csökkenti a komplexitást Az osztályok könnyítik a a kódok „újrafelhasználhatóságát” rengeteg Python modul új osztályokat definiál minden osztály szeparált környezettel rendelkezik (azonos fv. nevek nem okoznak gondot) öröklődés lehetővé teszi kiterjesztését vagy épp módosítását az ősosztálya viselkedésének egy bizonyos részén
7
Osztályok Különbség van az osztály létrehozása és az osztály egy példányának használata között: osztályt létrehozni: meghatározni az osztály nevét meghatározni az osztály attribútumait pl.: valaki megírta a kódját egy lista osztálynak felhasználni egy osztályt: új példányokat létrehozni műveleteket végrehajtani a példányon pl.: L = [1,2], len(L)
8
Osztályok definiálása
A class kulcsszó használatával: osztály def osztály neve osztály szülő Hasonlóan a def-nél, megfelelően kell alkalmazni a behúzásokat, hogy jelezzük, a kód mely része tartozik az osztályhoz Az object itt azt jelöli, hogy a Coordinate egy Python objektum és annak minden metódusát örökli szülő/gyerek viszony
9
Mik azok az attribútumok?
Adatok és procedúrák, amik az osztályhoz tartoznak adat attribútum: olyan egyéb objektum(ok), amelyből összeáll az osztály pl.: egy koordináta két számból áll metódusok (procedurális attribútumok): olyan függvények és procedúrák, amik csak ezzel az osztállyal működnek együtt meghatározza, hogyan lehet interakcióba lépni az objektummal pl.: meghatározhatjuk, hogyan szeretnénk kiszámítani két koordináta távolságát, de ez a távolság nem meghatározható két list objektumra
10
Osztály létrehozásának meghatározása
Először meg kell határoznunk, hogy egy osztály létrejöttekor hogy szeretnénk azt inicializálni Speciális metódus: __init__ segítségével az adat attribútumokhoz kezdeti érték rendelhető
11
Osztály példány létrehozni
egy példány adat attribútumait példány változóknak hívjuk a self-re nem kell argumentumot biztosítani, a Python automatikusan megteszi
12
Mi egy metódus? Procedurális attribútumok, egy függvény ami csak az osztályon értelmezhető A Python az első értékként mindig az objektumot küldi konvenció: használjuk a self nevet, minden metódus első argumentumaként A „.” operátor biztosítja bármilyen attribútum elérését: adat attribútum procedurális attribútum
13
Egy metódus definiálása
a self és a . jelölésen kívül a metódusok ugyan úgy működnek, mint a függvények (paraméterek olvasása, műveletek elvégzése, visszatérés)
14
Metódus használata Hagyományos mód: Ekvivalens:
15
Objektum kiírási reprezentációk
Az alap reprezentáció nem informatív __str__ metódus definiálása A Python ezt hívja meg az osztályon a print metódus során Meghatározhatjuk a működését! Pl.: a Coordinate a következőképp jelenjen meg:
16
Saját print metódus
17
Speciális operátorok +, -, ==, <, >, len(), print és még sokan mások Úgy, mint a print esetében, ezeket is felül lehet írni, hogy az osztállyal megfelelően tudjanak működni Kétszeres alsóvonással lehet őket definiálni:
18
Feladat: törtek Készítsünk egy új típust ami a számokat törtként (Fractions) reprezentál A belső reprezentáció két egész szám: számláló (numerator) nevező (denominator) Interfész (azaz metódusok): összeadás, kivonás print, float konvertálás törtszám invertálás
19
Összegzés Összecsomagolni objektumokat, amik:
közös adatokat procedúrákat, amik ezeken az adatokon futnak Használjunk absztrakciót ahhoz, hogy különbséget tudjunk tenni az objektumok implementálása és az objektumok használata között Használjunk öröklődést, hogy reprezentálhassunk különböző absztrakciós rétegeket Készítsünk saját osztályokat, amik a Python alapobjektumait használják
20
Getter és setter metódusok
Getter és setter metódusok az osztályok adat attribútumaiknak elérésére szolgálnak
21
Információ elfedése Az osztály készítője átnevezi az attribútumok változó neveit Ha az osztályok adat attribútumait használjuk, de közben változhat az osztály definíciója Az osztály hatáskörén kívül használjuk a gettereket és settereket jó kódolási design könnyű karbantartani megelőzhetőek bug-ok
22
Python problémái az információ elrejtésben
Engedélyezi az adat attribútumok osztályon kívüli elérését print(a.age) Engedélyezi az adat attribútumok osztályon kívüli írását is! a.age = 'infinity' Engedélyezi új adat attribútumok hozzáadását az osztálydefiníción kívül! a.size = 'tiny’ Ez nagyon rossz kódolási stílus!
23
Alapértelmezett értékek
A formális paraméterekre az alapértelmezett értékek akkor lépnek érvénybe, ha nincs nincs konkrét érték adva metódus hívásakor Példa:
24
Hierarchiák Ősosztály (superclass) Származtatott osztály (subclass)
Minden tulajdonság öröklődik a szülőtől Hozzáadott infó Hozzáadott működés/funkció Korábbi működés felülírása
25
Öröklődés: szülő osztály
26
Öröklődés: gyerek osztály
Hozzáadott funkcionalitás: speak() A Cat példányt meg lehet hívni az új metódussal Az Animal példánya hibát dob ha a Cat új metódusával hívjuk meg Az __init__ nem hiányzik, az Animal osztályét használjuk
27
Melyik metódust használjuk?
Egy subclass implementálhat a superclass metódusaival megegyező nevű metódusokat Osztálypéldány esetében, keressük meg az osztály definíciójában a metódus nevét Ha nincs meg, keressük a hierarchiában feljebb (szülő, nagyszülő, stb) Használjuk az első metódust, amit először találunk a hierarchiában
30
Osztály változók és Rabbit subclass
Az osztály változók és értékeik minden osztály között meg vannak osztva A tag az osztály példányok egyedi azonosításához létrehozott ID
31
Rabbit GETTER metódusok
32
Saját típusok használata
Definiálni a + operátort két Rabbit példány között mit csinál egy r3 = r1 + r2, ha r1, r2 Rabbit példány r3 egy új példány, aminek életkora 0 r3-nak self az egyik szülője és other a másik az __init__-ben parent1 és parent2 Rabbit típusú
33
Speciális metódus két Rabbit összehasonlításához
Két Rabbit példány akkor legyen egyező, ha a szüleik megegyeznek Hasonlítsuk össze az ID-kat (azok egyediek) Objektumokat nem lehet közvetlenül összehasonlítani
34
OOP összefoglalás Saját adatkollekciók készítése
Információ rendszerezése Munka felosztása Adatok elérésének konzisztens módja Rétegelt komplexitás Akárcsak a függvények, az osztályok is dekompozíciós és absztrakciós mechanizmusok a programozásban
35
Vége Köszönöm a figyelmet!
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.