Mik azok a mágikus módszerek a Pythonban és hogyan kell használni őket

A Python egyik kevésbé ismert, de értékes funkciója a mágikus módszerek objektumokon való megvalósításának képessége. Mágikus módszerekkel tisztább kódot írhatunk, amely intuitív és könnyen érthető.

A varázslatos módszerekkel interfészeket hozhatunk létre az objektumokkal való interakcióhoz, méghozzá úgy, hogy Pythonic-nak tűnik. Ez a cikk bemutatja a varázslatos módszereket, megvitatja azok létrehozásának bevált gyakorlatait, és feltárja azokat a gyakori varázslatos módszereket, amelyekkel találkozhat.

Mik azok a mágikus módszerek?

A mágikus metódusok Python-metódusok, amelyek meghatározzák, hogyan viselkedjenek a Python-objektumok, amikor általános műveleteket hajtanak végre rajtuk. Ezeket a metódusokat a metódus neve előtt és után kettős aláhúzásjelek határozzák meg.

Ennek eredményeként ezeket általában dunder módszereknek nevezik, mint a dupla aláhúzásnál. Egy gyakori dunder metódus, amellyel már találkozhatott, az __init__() metódus, amelyet osztálykonstruktorok meghatározására használnak.

A dunder metódusokat általában nem arra tervezték, hogy közvetlenül a kódban hívják meg őket; hanem a program futása közben hívja meg őket a tolmács.

Miért hasznosak a mágikus módszerek?

A mágikus módszerek hasznos fogalmak a Python objektumorientált programozásában. Használatuk segítségével megadhatja az egyéni adattípusok viselkedését, ha azokat általános, beépített műveletekkel használják. Ezek a műveletek a következőket tartalmazzák:

🟢 Aritmetikai műveletek

🟢 Összehasonlító műveletek

🟢 Életciklus-műveletek

🟢 Képviseleti műveletek

A következő rész azt tárgyalja, hogyan lehet megvalósítani azokat a varázslatos módszereket, amelyek meghatározzák az alkalmazás viselkedését, ha a fenti kategóriák mindegyikében használják.

Hogyan határozzuk meg a mágikus módszereket

Mint korábban említettük, a mágikus módszerek határozzák meg az objektumok viselkedését. Mint ilyenek, az objektum osztályának részeként vannak definiálva. Mivel az objektumosztály részét képezik, első argumentumként veszik fel, amely magára az objektumra vonatkozik.

  A Google Drive Progressive Web App használata

További érveket is felvehetnek attól függően, hogy a tolmács hogyan hívja meg őket. A nevük előtt és után két aláhúzás is egyértelműen meghatározható.

Végrehajtás

Az eddig tárgyaltak nagy része elméletinek és elvontnak tűnik. Ebben a részben egy egyszerű Rectangle osztályt fogunk megvalósítani.

Ennek az osztálynak hossz és szélesség tulajdonságai lesznek. Az __init__ metódussal megadhatja ezeket a tulajdonságokat a példányosításkor. Ezenkívül a ==, < és > operátorok segítségével összehasonlíthatja a különböző téglalapokat, hogy megnézze, egyenlő-e, kisebb-e vagy nagyobb-e egy másikkal. Végül a téglalapnak képesnek kell lennie arra, hogy értelmes karakterlánc-ábrázolást biztosítson.

A kódolási környezet beállítása

Ennek az áttekintésnek a követéséhez Python futtatókörnyezetre lesz szüksége. Használhat helyi verziót, vagy használhatja az online etoppc.com Python fordítót.

A téglalap osztály létrehozása

Először is kezdjük a Rectangle osztály meghatározásával.

class Rectangle:
    pass

A konstruktor módszer létrehozása

Ezután hozzuk létre az első mágikus metódusunkat, az osztálykonstruktor módszert. Ez a metódus felveszi a magasságot és a szélességet, és attribútumként tárolja azokat az osztálypéldányon.

class Rectangle:
    def __init__(self, height, width):
        self.height = height
        self.width = width

Varázslatos módszer készítése húrábrázoláshoz

Ezután egy olyan metódust akarunk létrehozni, amely lehetővé teszi az osztályunk számára, hogy egy ember által olvasható karakterláncot generáljon az objektum reprezentálására. Ezt a metódust akkor hívjuk meg, amikor a Rectangle osztály egy példányában átmenő str() függvényt argumentumként hívjuk meg. Ez a metódus akkor is meghívásra kerül, ha olyan függvényeket hív meg, amelyek karakterlánc-argumentumot várnak, például a nyomtatási függvényt.

class Rectangle:
    def __init__(self, height, width):
        self.height = height
        self.width = width

    def __str__(self):
        return f'Rectangle({self.height}, {self.width})'

A __str__() metódusnak egy olyan karakterláncot kell visszaadnia, amelyet az objektumot szeretne reprezentálni. Ebben az esetben egy Rectangle(, ) formátumú karakterláncot adunk vissza, ahol a magasság és a szélesség a téglalap tárolt méretei.

Varázslatos módszerek létrehozása összehasonlítási műveletekhez

Ezután összehasonlító operátorokat szeretnénk létrehozni az egyenlő, kisebb és nagyobb műveletekhez. Ezt hívják kezelői túlterhelésnek. Ezek létrehozásához a __eq__, __lt__ és __gt__ mágikus metódusokat használjuk. Ezek a módszerek a téglalapok területeinek összehasonlítása után logikai értéket adnak vissza.

class Rectangle:
    def __init__(self, height, width):
        self.height = height
        self.width = width

    def __str__(self):
        return f'Rectangle({self.height}, {self.width})'

    def __eq__(self, other):
        """ Checking for equality """
        return self.height * self.width == other.height * other.width

    def __lt__(self, other):
        """ Checking if the rectangle is less than the other one """
        return self.height * self.width < other.height * other.width

    def __gt__(self, other):
        """ Checking if the rectage is greater than the other one """
        return self.height * self.width > other.height * other.width

Mint látható, ezek a módszerek két paramétert vesznek fel. Az első az aktuális téglalap, a második pedig a másik érték, amellyel összehasonlítják. Ez az érték lehet egy másik téglalap példány vagy bármilyen más érték. Az összehasonlítás logikája és azok a feltételek, amelyek mellett az összehasonlítás igaz lesz, teljesen Önön múlik.

  7 legjobb Discord proxy 2023-ban

Gyakori varázslatos módszerek

Ebben a következő részben megvitatjuk azokat a gyakori mágikus módszereket, amelyekkel találkozni fogsz és amelyeket használsz.

#1. Aritmetikai műveletek

Az aritmetikai mágikus metódusok akkor hívódnak meg, ha az osztály egy példánya egy számtani előjel bal oldalára kerül. A metódus két argumentummal kerül meghívásra, az első a példányra való hivatkozás. A második érték a jeltől jobbra lévő objektum. A módszerek és a jelek a következők:

NameMethodSignDescriptionAddition__add__+Hozzáadást valósít meg. Kivonás__sub__–Kivonást valósít meg.Multiplication__mul__*MultiplicationDivision__div__/Osztást valósít meg.Floor division__floordiv__//Fedőosztást valósít meg.

#2. Összehasonlító műveletek

Az aritmetikai mágikus módszerekhez hasonlóan ezeket a metódusokat akkor hívják meg, ha annak az osztálynak a példánya, amelyhez definiálták őket, az összehasonlító operátor bal oldalán található. Ezenkívül az aritmetikai mágikus módszerekhez hasonlóan két paraméterrel hívják meg őket; az első hivatkozás az objektum példányára. A második a jel jobb oldalán található értékre való hivatkozás.

NameMethodSignDescriptionLess than__lt__valósítja meg a nagyobbat, mint összehasonlításEqual to__eq__==Az egyenlőt valósítja meg: Less than vagy egyenlő__le__>=A kisebb vagy egyenlő, mint az összehasonlítás összehasonlítás

  Hogyan kapcsolja ki a számítógépet a telefonról

#3. Életciklus-műveletek

Ezeket a metódusokat a rendszer egy objektum különböző életciklus-módszereire adott válaszként hívja meg, mint például a példányosítás vagy a törlés. A __init__ konstruktor ebbe a kategóriába tartozik. Az ebbe a kategóriába tartozó általános módszereket az alábbi táblázat sorolja fel:

NameMethodDescriptionConstructor__init__Ez a metódus akkor kerül meghívásra, amikor a definiált osztály egy objektuma törlésre kerül. Használható tisztítási műveletek végrehajtására, például az általa megnyitott fájlok bezárására.Deletion__del__Ez a metódus akkor kerül meghívásra, amikor a definiált osztály egy objektuma törlésre kerül. Használható tisztítási műveletek végrehajtására, például a megnyitott fájlok bezárására.New__new__A __new__ metódus hívódik meg először, amikor a megadott osztályba tartozó objektum példányosodik. Ezt a metódust a konstruktor előtt hívják meg, és beveszi az osztályt, valamint minden további argumentumot. Az osztály egy példányát adja vissza. Többnyire nem túl hasznos, de itt részletesen foglalkozunk vele.

#4. Képviseleti műveletek

NameMethodDescriptionStr__str__Az objektum ember által olvasható karakterlánc-reprezentációját adja vissza. Ez a metódus akkor hívódik meg, amikor meghívjuk az str() függvényt, és argumentumként adjuk át az osztály egy példányát. Akkor is meghívásra kerül, amikor a példányban átadja a print() és format() függvényeket. Célja, hogy az alkalmazás végfelhasználója számára érthető karakterláncot biztosítson.Repr__repr__A fejlesztő által használt objektum karakterlánc-reprezentációját adja vissza. Ideális esetben a visszaadott karakterláncnak információban gazdagnak kell lennie, hogy az objektum azonos példányát csak a karakterláncból állíthassa elő.

A varázslatos módszerek létrehozásának legjobb gyakorlatai

A mágikus módszerek hihetetlenek, és leegyszerűsítik a kódot. Használatakor azonban fontos szem előtt tartani a következőket.

  • Használja őket takarékosan – Ha túl sok mágikus módszert alkalmaz az osztályokban, a kód nehezen érthetővé válik. Csak a lényegesek megvalósítására korlátozza magát.
  • Használata előtt győződjön meg arról, hogy megértette az olyan metódusok teljesítményét, mint a __setatrr__ és a __getattr__.
  • Dokumentálja mágikus módszereinek viselkedését, hogy más fejlesztők pontosan tudják, mit csinálnak. Ez megkönnyíti számukra a használatukat és szükség esetén a hibakeresést.

Végső szavak

Ebben a cikkben a mágikus módszereket mutattam be, mint olyan osztályok készítésének módját, amelyek beépített műveletekkel használhatók. Megvitattam azt is, hogyan definiálják őket, és végigvittem egy példát egy olyan osztályról, amelyben varázslatos módszereket valósítottak meg. Ezután megemlítettem a különböző módszereket, amelyeket valószínűleg használni fog, és amelyekre szüksége van, mielőtt megosztana néhány szem előtt tartandó bevált gyakorlatot.

Ezután érdemes megtanulnia, hogyan valósítsa meg a Counter osztályt Pythonban.