Τι είναι οι μαγικές μέθοδοι στην Python και πώς να τις χρησιμοποιήσετε

Ένα από τα λιγότερο γνωστά αλλά πολύτιμα χαρακτηριστικά της Python είναι η ικανότητα εφαρμογής μαγικών μεθόδων σε αντικείμενα. Χρησιμοποιώντας μαγικές μεθόδους, μπορούμε να γράψουμε καθαρότερο κώδικα που να είναι διαισθητικός και εύκολος στην κατανόηση.

Με τις μαγικές μεθόδους, μπορούμε να δημιουργήσουμε διεπαφές για αλληλεπίδραση με αντικείμενα με τρόπο που να φαίνεται πιο Pythonic. Αυτό το άρθρο θα σας παρουσιάσει μαγικές μεθόδους, θα συζητήσει τις βέλτιστες πρακτικές για τη δημιουργία τους και θα εξερευνήσει τις κοινές μαγικές μεθόδους που θα συναντήσετε.

Τι είναι οι μαγικές μέθοδοι;

Οι μαγικές μέθοδοι είναι μέθοδοι Python που καθορίζουν πώς συμπεριφέρονται τα αντικείμενα Python όταν εκτελούνται κοινές λειτουργίες σε αυτά. Αυτές οι μέθοδοι ορίζονται ευδιάκριτα με διπλές υπογραμμίσεις πριν και μετά το όνομα της μεθόδου.

Ως αποτέλεσμα, ονομάζονται συνήθως dunder μέθοδοι, όπως στη διπλή υπογράμμιση. Μια κοινή μέθοδος dunder που μπορεί να έχετε ήδη συναντήσει είναι η μέθοδος __init__() που χρησιμοποιείται για τον ορισμό των κατασκευαστών κλάσεων.

Συνήθως, οι μέθοδοι dunder δεν προορίζονται να καλούνται απευθείας στον κώδικά σας. Αντίθετα, θα καλούνται από τον διερμηνέα καθώς εκτελείται το πρόγραμμα.

Γιατί είναι χρήσιμες οι μαγικές μέθοδοι;

Οι μαγικές μέθοδοι είναι μια χρήσιμη έννοια στον Αντικειμενοστραφή Προγραμματισμό στην Python. Χρησιμοποιώντας τα, καθορίζετε τη συμπεριφορά των προσαρμοσμένων τύπων δεδομένων σας όταν χρησιμοποιούνται με κοινές, ενσωματωμένες λειτουργίες. Αυτές οι λειτουργίες περιλαμβάνουν:

🟢 Αριθμητικές πράξεις

🟢 Λειτουργίες σύγκρισης

🟢 Λειτουργίες κύκλου ζωής

Λειτουργίες αντιπροσώπευσης

Η επόμενη ενότητα θα συζητήσει τον τρόπο εφαρμογής μαγικών μεθόδων που καθορίζουν πώς συμπεριφέρεται η εφαρμογή όταν χρησιμοποιείται σε όλες τις παραπάνω κατηγορίες.

Πώς να ορίσετε τις μαγικές μεθόδους

Όπως αναφέρθηκε προηγουμένως, οι μαγικές μέθοδοι καθορίζουν τη συμπεριφορά των αντικειμένων. Ως εκ τούτου, ορίζονται ως μέρος της κλάσης του αντικειμένου. Επειδή αποτελούν μέρος της κλάσης αντικειμένου, λαμβάνουν ως πρώτο όρισμα τον εαυτό που είναι μια αναφορά στο ίδιο το αντικείμενο.

  Κάντε την εκμάθηση γλωσσών διασκεδαστική για παιδιά με το Mondly

Μπορούν να λάβουν πρόσθετα επιχειρήματα ανάλογα με το πώς θα καλούνται από τον διερμηνέα. Ορίζονται επίσης ευδιάκριτα με δύο κάτω παύλες πριν και μετά το όνομά τους.

Εκτέλεση

Πολλά από αυτά που έχουμε συζητήσει μέχρι τώρα φαίνονται θεωρητικά και αφηρημένα. Σε αυτή την ενότητα, θα εφαρμόσουμε μια απλή κλάση Rectangle.

Αυτή η κλάση θα έχει ιδιότητες μήκους και πλάτους. Χρησιμοποιώντας τη μέθοδο __init__, μπορείτε να καθορίσετε αυτές τις ιδιότητες κατά την εγκατάσταση. Επιπλέον, θα μπορείτε να συγκρίνετε διαφορετικά ορθογώνια για να δείτε αν είναι ίσο, μικρότερο ή μεγαλύτερο από ένα άλλο χρησιμοποιώντας τους τελεστές ==, < και >. Τέλος, το ορθογώνιο θα πρέπει να είναι ικανό να παρέχει μια ουσιαστική αναπαράσταση συμβολοσειράς.

Ρύθμιση του Περιβάλλοντος Κωδικοποίησης

Για να ακολουθήσετε αυτήν την περιγραφή, θα χρειαστείτε ένα περιβάλλον χρόνου εκτέλεσης Python. Μπορείτε να χρησιμοποιήσετε έναν τοπικό ή μπορείτε να χρησιμοποιήσετε τον διαδικτυακό μεταγλωττιστή grtechpc.org Python.

Δημιουργία της τάξης του ορθογωνίου

Αρχικά, ας ξεκινήσουμε ορίζοντας την κλάση Rectangle.

class Rectangle:
    pass

Δημιουργία της μεθόδου κατασκευαστή

Στη συνέχεια, ας δημιουργήσουμε την πρώτη μας μαγική μέθοδο, τη μέθοδο κατασκευής κλάσεων. Αυτή η μέθοδος θα λάβει το ύψος και το πλάτος και θα τα αποθηκεύσει ως χαρακτηριστικά στην παρουσία κλάσης.

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

Δημιουργία μιας μαγικής μεθόδου για την αναπαράσταση συμβολοσειρών

Στη συνέχεια, θέλουμε να δημιουργήσουμε μια μέθοδο που επιτρέπει στην τάξη μας να δημιουργήσει μια συμβολοσειρά αναγνώσιμη από τον άνθρωπο για να αναπαραστήσει το αντικείμενο. Αυτή η μέθοδος θα καλείται κάθε φορά που καλούμε τη συνάρτηση str() που περνά σε μια παρουσία της κλάσης Rectangle ως όρισμα. Αυτή η μέθοδος θα καλείται επίσης όταν καλείτε συναρτήσεις που αναμένουν όρισμα συμβολοσειράς, όπως η συνάρτηση εκτύπωσης.

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

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

Η μέθοδος __str__() θα πρέπει να επιστρέψει μια συμβολοσειρά που θα θέλατε να αντιπροσωπεύει το αντικείμενο. Σε αυτήν την περίπτωση, επιστρέφουμε μια συμβολοσειρά της μορφής Rectangle (<ύψος>, <πλάτος>) όπου το ύψος και το πλάτος είναι οι αποθηκευμένες διαστάσεις του ορθογωνίου.

Δημιουργία μαγικών μεθόδων για λειτουργίες σύγκρισης

Στη συνέχεια, θέλουμε να δημιουργήσουμε τελεστές σύγκρισης για τις πράξεις ίσες προς, μικρότερες και μεγαλύτερες από. Αυτό ονομάζεται υπερφόρτωση χειριστή. Για να τα δημιουργήσουμε, χρησιμοποιούμε τις μαγικές μεθόδους __eq__, __lt__ και __gt__ αντίστοιχα. Αυτές οι μέθοδοι θα επιστρέψουν μια boolean τιμή μετά τη σύγκριση των περιοχών των ορθογωνίων.

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

Όπως μπορείτε να δείτε, αυτές οι μέθοδοι έχουν δύο παραμέτρους. Το πρώτο είναι το τρέχον ορθογώνιο και το δεύτερο είναι η άλλη τιμή με την οποία συγκρίνεται. Αυτή η τιμή μπορεί να είναι μια άλλη παρουσία του Rectangle ή οποιαδήποτε άλλη τιμή. Η λογική για το πώς η σύγκριση και οι συνθήκες υπό τις οποίες η σύγκριση θα επιστρέψει αληθινή εξαρτάται αποκλειστικά από εσάς.

  Πώς να χρησιμοποιήσετε τη λειτουργία χαμηλής κατανάλωσης Apple Watch

Κοινές Μαγικές Μέθοδοι

Σε αυτήν την επόμενη ενότητα, θα συζητήσουμε τις κοινές μαγικές μεθόδους που θα συναντήσετε και θα χρησιμοποιήσετε.

#1. Αριθμητικές Πράξεις

Οι αριθμητικές μαγικές μέθοδοι καλούνται όταν ένα στιγμιότυπο της τάξης σας τοποθετείται στην αριστερή πλευρά ενός αριθμητικού σημείου. Η μέθοδος θα κληθεί με δύο ορίσματα, με το πρώτο να είναι μια αναφορά στο παράδειγμα. Η δεύτερη τιμή είναι το αντικείμενο στα δεξιά της πινακίδας. Οι μέθοδοι και τα σημάδια είναι οι εξής:

NameMethodSignDescriptionAddition__add__+Εφαρμόζει την προσθήκη. Αφαίρεση__υπο__–Εφαρμόζει την αφαίρεση.Πολλαπλασιασμός__mul__*Εφαρμόζει τον πολλαπλασιασμόDivision__div__/Implements division.Floor division__floordiv__//Implements division floor.

#2. Λειτουργίες σύγκρισης

Όπως και οι αριθμητικές μαγικές μέθοδοι, αυτές οι μέθοδοι καλούνται όταν μια παρουσία της κλάσης για την οποία ορίζονται τοποθετείται στα αριστερά του τελεστή σύγκρισης. Επίσης, όπως οι αριθμητικές μαγικές μέθοδοι, καλούνται με δύο παραμέτρους. το πρώτο είναι μια αναφορά στην παρουσία του αντικειμένου. Το δεύτερο είναι μια αναφορά στην τιμή στη δεξιά πλευρά της πινακίδας.

NameMethodSignDescriptionLess than__lt__<Εφαρμόζει το μικρότερο από σύγκρισηΜεγαλύτερη από__gt__>Εφαρμόζει το μεγαλύτερο από σύγκρισηΕξίσου με__eq__==Εφαρμόζει το ίσο με σύγκρισηΛιγότερο ή ίσο με__le__>=Εφαρμόζει το μικρότερο ή ίσο με σύγκρισηΜεγαλύτερο ή ίσο με το μεγαλύτερο από το__ ή το ίσο με< σύγκριση

  8 Γεννήτρια μουσικής AI για να ξεκινήσετε τη σύνθεση μελωδιών

#3. Λειτουργίες κύκλου ζωής

Αυτές οι μέθοδοι θα καλούνται ως απόκριση στις διαφορετικές μεθόδους κύκλου ζωής ενός αντικειμένου, όπως η δημιουργία ή η διαγραφή. Ο κατασκευαστής, __init__ εμπίπτει σε αυτήν την κατηγορία. Οι συνήθεις μέθοδοι αυτής της κατηγορίας παρατίθενται στον παρακάτω πίνακα:

NameMethodDescriptionConstructor__init__Αυτή η μέθοδος καλείται κάθε φορά που διαγράφεται ένα αντικείμενο της κλάσης για την οποία έχει οριστεί. Μπορεί να χρησιμοποιηθεί για την εκτέλεση ενεργειών εκκαθάρισης, όπως το κλείσιμο όλων των αρχείων που είχε ανοίξει.Deletion__del__Αυτή η μέθοδος καλείται κάθε φορά που διαγράφεται ένα αντικείμενο της κλάσης για την οποία έχει οριστεί. Μπορεί να χρησιμοποιηθεί για την εκτέλεση ενεργειών εκκαθάρισης, όπως το κλείσιμο όλων των αρχείων που είχε ανοίξει.New__new__Η μέθοδος __new__ καλείται πρώτη όταν ένα αντικείμενο της καθορισμένης κλάσης εγκαθίσταται. Αυτή η μέθοδος καλείται πριν από τον κατασκευαστή και δέχεται την κλάση καθώς και τυχόν πρόσθετα ορίσματα. Επιστρέφει ένα στιγμιότυπο της κλάσης. Ως επί το πλείστον, δεν είναι πολύ χρήσιμο, αλλά καλύπτεται λεπτομερώς εδώ.

#4. Λειτουργίες Αντιπροσώπευσης

NameMethodDescriptionStr__str__Επιστρέφει μια αναπαράσταση συμβολοσειράς αναγνώσιμη από τον άνθρωπο του αντικειμένου. Αυτή η μέθοδος καλείται όταν καλείτε τη συνάρτηση str(), μεταβιβάζοντας μια παρουσία της κλάσης ως όρισμα. Καλείται επίσης όταν περνάτε στην παρουσία στις συναρτήσεις print() και format(). Προορίζεται να παρέχει μια συμβολοσειρά που είναι κατανοητή από τον τελικό χρήστη της εφαρμογής.Repr__repr__Επιστρέφει μια παράσταση συμβολοσειράς του αντικειμένου που χρησιμοποιείται από τον προγραμματιστή. Στην ιδανική περίπτωση, η συμβολοσειρά που επιστρέφεται θα πρέπει να είναι πλούσια σε πληροφορίες, έτσι ώστε να μπορείτε να δημιουργήσετε μια πανομοιότυπη παρουσία του αντικειμένου μόνο από τη συμβολοσειρά.

Βέλτιστες πρακτικές για τη δημιουργία μαγικών μεθόδων

Οι μαγικές μέθοδοι είναι απίστευτες και θα απλοποιήσουν τον κώδικά σας. Ωστόσο, είναι σημαντικό να έχετε υπόψη σας τα ακόλουθα πράγματα όταν τα χρησιμοποιείτε.

  • Χρησιμοποιήστε τα με φειδώ – Η εφαρμογή πάρα πολλών μαγικών μεθόδων στις τάξεις σας κάνει τον κώδικά σας δυσνόητο. Περιοριστείτε στην εφαρμογή μόνο των βασικών.
  • Βεβαιωθείτε ότι κατανοείτε τις επιπτώσεις απόδοσης μεθόδων όπως __setatrr__ και __getattr__ πριν τις χρησιμοποιήσετε.
  • Τεκμηριώστε τη συμπεριφορά των μαγικών μεθόδων σας, ώστε άλλοι προγραμματιστές να γνωρίζουν ακριβώς τι κάνουν. Αυτό διευκολύνει τη χρήση τους και τον εντοπισμό σφαλμάτων όταν είναι απαραίτητο.

Τελικές Λέξεις

Σε αυτό το άρθρο, εισήγαγα τις μαγικές μεθόδους ως τρόπο δημιουργίας κλάσεων που μπορούν να χρησιμοποιηθούν με ενσωματωμένες λειτουργίες. Συζήτησα επίσης πώς ορίζονται και πέρασα από ένα παράδειγμα κλάσης που εφάρμοσαν οι μαγικές μέθοδοι. Στη συνέχεια, ανέφερα τις διαφορετικές μεθόδους που πιθανότατα θα χρησιμοποιήσετε και θα χρειαστείτε πριν μοιραστείτε μερικές βέλτιστες πρακτικές που πρέπει να έχετε υπόψη σας.

Στη συνέχεια, ίσως θέλετε να μάθετε πώς να υλοποιείτε την κλάση Counter στην Python.