Βελτιώστε τη συμπεριφορά των τάξεων σας με τον ευέλικτο μηχανισμό παράκαμψης της Python.

Στην Python, οι κλάσεις παρέχουν ένα καθαρό μέσο για τη δέσμη δεδομένων και λειτουργικότητας σε επαναχρησιμοποιήσιμα στοιχεία. Η δημιουργία προσαρμοσμένων κλάσεων σάς επιτρέπει να μοντελοποιείτε οντότητες πραγματικού κόσμου, όπως χρήστες, προϊόντα και υπαλλήλους.

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

Κατανόηση των μαγικών μεθόδων

Φανταστείτε τις μαγικές μεθόδους, που ονομάζονται επίσης μέθοδοι dunder, ως μυστικά ξόρκια ή κρυφά άσματα που η Python καλεί αυτόματα όταν εκτελείτε συγκεκριμένες ενέργειες σε ένα αντικείμενο.

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

Οι μαγικές μέθοδοι είναι μέθοδοι στιγμιότυπων στην Python που έχουν δύο κάτω παύλες (__μέθοδος__) πριν και μετά το όνομα της μεθόδου.

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

  • __gt__: Αυτή η μέθοδος ελέγχει εάν ένα αντικείμενο είναι μεγαλύτερο από ένα άλλο.
  • __μέσα σε αυτό__: Αυτή η μέθοδος εκτελείται όταν δημιουργείτε ένα στιγμιότυπο μιας κλάσης και είναι κυρίως για αρχικοποίηση χαρακτηριστικών.
  • __str__: Επιστρέφει μια παράσταση συμβολοσειράς της κλάσης που περιγράφει το αντικείμενο.
  • __repr__: Αυτή η μέθοδος δίνει μια έξοδο που σας επιτρέπει να αναδημιουργήσετε το αντικείμενο χρησιμοποιώντας eval().
  • __len__: Όταν χρησιμοποιείτε το len () συνάρτηση σε ένα αντικείμενο αυτή η μέθοδος επιστρέφει το μήκος του αντικειμένου.
  • __eq__: Αυτή η μέθοδος επιτρέπει τη σύγκριση μεταξύ αντικειμένων χρησιμοποιώντας το διπλό ίσο με (==) χειριστής.
  • __lt__: Υλοποιεί λιγότερο από (
  • __Προσθήκη__: Όταν χρησιμοποιείτε την προσθήκη (+) τελεστής σε αντικείμενα αυτή η μέθοδος εκτελείται και εκτελεί λειτουργίες προσθήκης.
  • __getitem__: Σας επιτρέπει να ανακτήσετε στοιχεία από ένα αντικείμενο χρησιμοποιώντας σύνταξη ευρετηρίου, όπως obj[κλειδί].

Εφαρμογή Μαγικών Μεθόδων

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

Αναπαράσταση συμβολοσειράς ενός αντικειμένου

Μπορείτε να προσαρμόσετε την αναπαράσταση συμβολοσειράς ενός αντικειμένου για αναγνωσιμότητα ή περαιτέρω επεξεργασία.

classPerson:
def__init__(self, name, age):
self.name = name
self.age = age

p1 = Person('John', 25)
print(p1)

Εδώ έχετε ένα απλό Πρόσωπο τάξη με ένα __μέσα σε αυτό__ μαγική μέθοδος για την αρχικοποίησή του. Όταν εκτυπώνετε το p1 αντικείμενο, χρησιμοποιεί την προεπιλεγμένη αναπαράσταση συμβολοσειράς που παρέχεται από την Python.

Για να προσαρμόσετε την αναπαράσταση συμβολοσειράς, ορίστε το __str__ και __repr__ μαγικές μέθοδοι:

classPerson:
def__init__(self, name, age, height):
self.name = name
self.age = age
self.height = height

def__str__(self):
returnf'{self.name} is {self.age} years old'

def__repr__(self):
returnf'{self.name} is {self.age} years old'

p1 = Person('John', 25, 78)
print(p1)

Τώρα έχετε μια πιο ευανάγνωστη και περιεκτική αναπαράσταση συμβολοσειρών του p1 αντικείμενο:

Ιδιότητα μήκους ενός αντικειμένου

Φανταστείτε ότι, όταν καλείτε το len () μέθοδος ενός αντικειμένου προσώπου, θέλετε το ύψος τους. Εφαρμόστε το __len__ μαγική μέθοδος για την Πρόσωπο τάξη:

classPerson:
def__init__(self, name, age, height):
self.name = name
self.age = age
self.height = height

def__str__(self):
returnf'{self.name} is {self.age} years old'

def__repr__(self):
returnf'{self.name} is {self.age} years old'

def__len__(self):
return self.height

p2 = Person('Issac', 25, 89)
print(len(p2))

ο __len__ Η μαγική μέθοδος επιστρέφει το χαρακτηριστικό ύψος του a Πρόσωπο παράδειγμα. Όταν καλείς len (p2), θα καλέσει το __len__ μαγική μέθοδος αυτόματα η οποία επιστρέφει το ύψος του p2 αντικείμενο.

Χειρισμός σύγκρισης μεταξύ αντικειμένων

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

classPerson:

def__init__(self, name, age, height):
self.name = name
self.age = age
self.height = height

def__str__(self):
returnf'{self.name} is {self.age} years old'

def__repr__(self):
returnf'{self.name} is {self.age} years old'

def__len__(self):
return self.height

def__eq__(self, other):
return self.name == other.name and self.age == other.age

p1 = Person('John', 25, 56)
p2 = Person('John', 25, 61)

print(p1 == p2)

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

Το διπλό ίσο με (==) ο χειριστής χρησιμοποιεί αυτή τη μέθοδο για να ελέγξει την ισότητα αντί να συγκρίνει ταυτότητες. Δύο λοιπόν Πρόσωπο οι παρουσίες είναι ίσες εάν έχουν τα ίδια χαρακτηριστικά ονόματος και ηλικίας. Αυτό σας επιτρέπει να παρακάμψετε την προεπιλεγμένη συμπεριφορά ελέγχου ισότητας για την προσαρμοσμένη κλάση σας.

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

Προηγμένες Μαγικές Μέθοδοι

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

Κάνοντας τις τάξεις να λειτουργούν σαν κοντέινερ

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

classPerson:
def__init__(self):
self.data = []

def__len__(self):
return len(self.data)

def__getitem__(self, index):
return self.data[index]

def__setitem__(self, index, value):
self.data[index] = value

def__delitem__(self, index):
del self.data[index]

p1 = Person()
p1.data = [10, 2, 7]
print(len(p1)) # 3

p1[0] = 5
print(p1[0]) # 5

Τώρα ένα αντικείμενο Person μπορεί να συμπεριφέρεται σαν κοντέινερ:

Προσαρμογή της πρόσβασης χαρακτηριστικών

Χρησιμοποιώντας την __getattr__ μαγική μέθοδο μπορείτε να προσαρμόσετε τα χαρακτηριστικά τρόπο του Πρόσωπο Η πρόσβαση στην τάξη γίνεται με βάση ορισμένες προϋποθέσεις.

classPerson:
def__getattr__(self, name):
if name == 'age':
return40
else:
raise AttributeError(f'No attribute {name}')

p1 = Person()
print(p1.age) # 40

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

Για οποιοδήποτε άλλο όνομα χαρακτηριστικού, θέτει ένα Χαρακτηριστικό Σφάλμα με αντίστοιχο μήνυμα.

Κάνοντας τις τάξεις να συμπεριφέρονται σαν καλεσμένες

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

classAdder:
def__call__(self, x, y):
return x + y

adder = Adder()
print(adder(2, 3)) # 5

Όταν δημιουργείτε μια παρουσία του Αθροιστής και μετά καλέστε το με επιχειρήματα, το __κλήση__ η μέθοδος εκτελείται και εκτελεί την προσθήκη πριν επιστρέψει το αποτέλεσμα.

Υπερφόρτωση χειριστή

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

classVector:
def__init__(self, x, y):
self.x = x
self.y = y

def__add__(self, other):
if isinstance(other, Vector):
new_x = self.x + other.x
new_y = self.y + other.y
return Vector(new_x, new_y)
else:
raise TypeError("Unsupported operand type for +")

def__str__(self):
returnf"({self.x}, {self.y})"

# Creating two Vector instances
v1 = Vector(2, 3)
v2 = Vector(1, 4)

# Adding two Vector instances using the + operator
v3 = v1 + v2

# Printing the result
print(v3) # Output: (3, 7)

Το αποτέλεσμα είναι ένα νέο διάνυσμα:

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

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

Αντικειμενοστραφής προγραμματισμός σε Python

Οι μαγικές μέθοδοι στην Python παρέχουν ισχυρούς τρόπους προσαρμογής και βελτίωσης της συμπεριφοράς των κλάσεων. Οι μαγικές μέθοδοι συμβαδίζουν με την έννοια του αντικειμενοστρεφούς προγραμματισμού (OOP) στην Python. Επομένως, είναι σημαντικό να κατανοήσετε την έννοια του OOP όταν προσπαθείτε να χρησιμοποιήσετε μαγικές μεθόδους.