Python Vincellér Zoltán
Emlékeztető: osztályok definiálása A class kulcsszó használatával: osztály def osztály neve osztály szülő Attribútumok: adat metódus
Dokumentumok, mint adategységek Ember-gép kapcsolat formanyomtatványok kitöltése minimálisan ellenőrizhető manuális Az internet korában gyakori lett a gép-gép interakció webes szolgáltatások (SOA, REST) szerver-szerver, szerver-kliens Szükséges olyan egységes adatkollekció, ami gép által könnyen interpretálható XML JSON
JSON JavaScript Object Notation Egyszerű („lightweight”) adatcserére alkalmas formátum Önleíró Könnyen értelmezhető embernek és gépnek egyaránt Nyelvfüggetlen Szintaxis adatok tárolásához és cseréjéhez Szöveges formátum JavaScript objektumok jelölésrendszerével
JSON { "name": "John", "age": 35, "birthday": "1989.05.27", "birthplace": "New York", "pets": [{ "name": "Bobby", "type": "dog" }, "name": "Fluffy", "type": "cat" } ]
JSON feladat Mindenki készítse el a saját JSON ”leírását”. Ez tartalmazza: vezetéknevét, keresztnevét (harmadik név nem kell), életkorát, lakhelyét (elég a város), egy tömbben a követlen szomszédait, ahol: egy szomszéd szintén objektumként szerepel, egyetlen adattagja van, az pedig a keresztneve Ezt a fájlt mentsétek el me.json-ként
JSON és Python A Python egyszerűvé teszi a JSON formátum használatát Alapértelmezett, azaz előtelepített modul Használatához: import json Lehetővé teszi JSON szövegek feldolgozását akár fájlból, akár string-ből Képes Python kollekciókká alakítani Dictionary List
JSON → Python A JSON fájlok vagy szövegek feldolgozásával lehetőség nyílik a JSON-ben meghatározott objektumokat natív Python-os objektumokká alakítani A json modul képes Dictionary-be, vagy List-be olvasni load() metódus - JSON dokumentumot tartalmazó read()-et támogató fájl-szerű objektum loads() metódus - JSON dokumentumot tartalmazó str vagy unicode példány import json jsonData = '{"name": "Frank", "age": 39}' jsonToPython = json.loads(jsonData) Használjuk a printet ellenőrzéshez!
Python → JSON Lehetőség van Pythonos objektumokat is JSON formátumra hozni Ehhez a json csomag dumps() metódusát hívjuk segítségül import json pythonDictionary = {'name':'Bob', 'age':44, 'isEmployed':True} dictionaryToJson = json.dumps(pythonDictionary) Ellenőrzéshez itt is használjunk printet!
Limitációk Fontos megjegyezni: a JSON nem képes az összes típus kezelésére tárolására, ami Pythonban is elérhető A következők támogatottak: List Dictionary Boolean Number Character None Minden egyéb típust konvertálni kell ahhoz, hogy JSON-ban tárolhassuk
Limitációk Tegyük fel, hogy van egy osztályunk: class Employee(object): def __init__(self, name): self.name = name Mi történik, hogy ha ennek az osztálynak egy példányát JSON-né szeretnénk konvertálni? Hibaüzenetet kapunk Használható az objektum __dict__ attribútuma
Feladatok Töltsük be fájlból a me.json-t. Ellenőrizzük a létrehozott objektum típusát Írjuk ki a konzolra az objektum tartalmát Írjuk ki a konzolra az objektum tartalmát, de most megfelelően indentálva (hint: használjuk a pprint függvényt) Alakítsuk a fent létrehozott Dictionary-t Python objektummá
Emlékeztető: Öröklődés Hierarchiák Superclass (ősosztály) Subclass (származtatott osztály) Miért használjuk? Új információ Működések kiegészítése Működés felülírása
Emlékeztető: információ elfedés, getter, setter Getter és setter metódusok az osztályok adat attribútumaiknak elérésére szolgálnak
Interfészek és absztrakt osztályok Programtervezés során az első lépcső az objektumok kellően absztrakt definiálása Szeretnénk egy magasabb szinten úgy meghatározni egyes objektumok működését, hogy azokat konkrétan nem implementáljuk Lehetőséget ad a többszintű fejlesztéshez Nem feltétlenül ugyanaz fogja az implementálást elvégezni, mint aki tervezte az objektum működését
Interfészek és absztrakt osztályok Az interfészek és absztrakt osztályok lehetőséget adnak a tervezési és fejlesztési folyamatok elkülönítésére Önmagában egyik sem példányosítható Sok magasabb szintű nyelv támogatja C#, JAVA, C++, stb.. Mi a különbség az absztrakt osztály és az interfész között? interfész: az implementálandó függvényeket és procedúrákat, illetve azok karakterisztikáját határozza meg, implementációt nem tartalmaz absztrakt osztály: az interfészhez hasonló, de konkrét implementációt és adatattribútumokat is tartalmazhat
Python és az absztrakt osztályok Python-ban az öröklődés „lazán” van kezelve Vegyük a következő példát: class AbstractClass: def do_something(self): pass class B(AbstractClass): a = AbstractClass() b = B()
Python és az absztrakt osztályok Ha az előző programot futtatjuk, hamar kiderül, hogy nem absztrakt osztályt hoztunk létre: eleve példányosítható már az AbstractClass is nincs a B származtatott osztályban do_something függvény implementálására kényszer A példaprogram egy szimpla öröklődést tartalmaz, nincs benne absztrakt osztály definiálva
Python Abstract Base Class A Python külön moduljával lehetőség nyílik absztrakt osztályok definiálására Ez az úgynevezett Abstract Base Class, a csomag neve rövidítve abc Használatához import abc vagy specifikusan from abc import ABCMeta, abstractmethod Python 3.+ felett kényelmesebb a használata
Python ABC Az előző példát kiegészítve definiáljunk egy absztrakt osztályt: class AbstractClassExample(object): __metaclass__ = ABCMeta def __init__(self, value): self.value = value super(AbstractClassExample, self).__init__() @abstractmethod def do_something(self): pass
Python ABC Az absztrakt osztályból készítsünk egy subclass-t, do_something fv. implementálása nélkül: class DoAdd42(AbstractClassExample): pass x = DoAdd42(4) Futtatáskor TypeError hibát kapunk, az exception szövegéből kiderül az oka
Python ABC Előző kód javítása: class DoAdd42(AbstractClassExample): def do_something(self): return self.value + 42 class DoMul42(AbstractClassExample): return self.value * 42 x = DoAdd42(10) y = DoMul42(10) print(x.do_something()) print(y.do_something())
Python ABC metódusai Egy absztrakt osztályból származtatott osztály addig nem példányosítható, amíg a definíciójában minden absztrakt metódus nincs implementálva Az ABC is tartalmazhat implementációt (???) A legelső származtatásnál felülíródik Mint minden öröklődésnél, itt is lehetséges az ősosztály metódusait meghívni super().do_something()
Python ABC metódusai from abc import ABCMeta, abstractmethod class AbstractClassExample(object): __metaclass__ = ABCMeta @abstractmethod def do_something(self): print('SuperDoSomething') class AnotherSubclass(AbstractClassExample): super(AnotherSubclass, self).do_something() print("The enrichment from AnotherSubclass") x = AnotherSubclass() x.do_something()
Feladat Készítsünk egy absztrakt osztályt, amit a sokszögekhez tervezünk. Az alábbi absztrakt metódusok legyenek benne definiálva: Terület számítása Kerület számítása Oldalak lekérdezése A fenti absztrakt osztályt felhasználva készítsünk egy háromszög és egy négyzet osztályt, illetve a négyszögek származtatott osztályait (trapéz, paralelogramma, deltoid, stb). Implementáljuk a szükséges metódusokat.
Vége Köszönöm a figyelmet!