εμπορεύματα

Python και προηγμένες μέθοδοι, λειτουργίες dunder για καλύτερο προγραμματισμό

Η Python είναι μια φανταστική γλώσσα προγραμματισμού, και όπως αποδεικνύεται από GitHub, είναι επίσης η δεύτερη πιο δημοφιλής γλώσσα το 2022.

Τα πιο ενδιαφέροντα πλεονεκτήματα της Python είναι η μεγάλη κοινότητα προγραμματιστών.

Φαίνεται ότι η Python έχει ένα πακέτο για κάθε περίπτωση χρήσης.

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

Οι μαγικές μέθοδοι είναι ένα σύνολο προμεθόδωνdefinites στην Python που παρέχουν ειδικά συντακτικά χαρακτηριστικά. Αναγνωρίζονται εύκολα από τις διπλές παύλες τους στην αρχή και στο τέλος, όπως __init__, __call__, __len__ … και τα λοιπά.

Οι Μαγικές Μέθοδοι

Οι μαγικές μέθοδοι επιτρέπουν στα προσαρμοσμένα αντικείμενα να συμπεριφέρονται παρόμοια με τους ενσωματωμένους τύπους Python.

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

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

Θυμηθείτε, η μαγεία της Python δεν βρίσκεται μόνο στην απλότητα και την ευελιξία της, αλλά και στα ισχυρά χαρακτηριστικά της, όπως οι λειτουργίες Dunder.

__init__

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

κατηγορία πίτσα:
def __init__(self, size, toppings):
αυτο.μέγεθος = μέγεθος
self.toppings = γαρνιτούρες

# Τώρα ας δημιουργήσουμε μια πίτσα
my_pizza = Πίτσα('μεγάλη', ['πεπερόνι', 'μανιτάρια'])

print(my_pizza.size) # Αυτό θα εκτυπώσει: μεγάλο
print(my_pizza.toppings) # Αυτό θα εκτυπώσει: ['pepperoni', 'mushrooms']

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

Εδώ, χρησιμοποιείται για να αναπαραστήσει το παράδειγμα της κλάσης. Έτσι, όταν γράφουμε self.size = μέγεθος, λέμε, "Γεια, αυτό το αντικείμενο πίτσας έχει ένα χαρακτηριστικό μέγεθος size, και θέλω να έχει όποιο μέγεθος έδωσα όταν δημιούργησα το αντικείμενο».

__str__ και __repr__

__Str__

Αυτή είναι η μαγική μέθοδος της Python που μας επιτρέπει defiδώστε μια περιγραφή για το προσαρμοσμένο προϊόν μας.

Όταν εκτυπώνετε ένα αντικείμενο ή το μετατρέπετε σε συμβολοσειρά χρησιμοποιώντας str(), Python ελέγξτε αν έχετε defiΈχω καταλήξει σε μια μέθοδο __str__ για την κλάση αυτού του αντικειμένου.

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

Μπορούμε να επεκτείνουμε το παράδειγμα Pizza για να συμπεριλάβουμε μια συνάρτηση __str__ ως εξής:

class Pizza: def __init__(self, size, toppings): self.size = size self.toppings = toppings def __str__(self): return f"A {self.size} pizza with {', '.join(self.toppings )}" my_pizza = Πίτσα('μεγάλη', ['πεπερόνι', 'μανιτάρια']) print(my_pizza) # Αυτό θα εκτυπώσει: Μια μεγάλη πίτσα με πεπερόνι, μανιτάρια
__repr__

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

Αν τηλεφωνήσετε repr() σε ένα αντικείμενο ή απλά πληκτρολογείτε το όνομα του αντικειμένου στην κονσόλα, η Python θα αναζητήσει μια μέθοδο __repr__.

Se __str__ δεν είναι definite, θα χρησιμοποιήσει η Python __repr__ ως αντίγραφο ασφαλείας όταν προσπαθείτε να εκτυπώσετε το αντικείμενο ή να το μετατρέψετε σε συμβολοσειρά. Έτσι είναι συχνά μια καλή ιδέα defiτελειώστε τουλάχιστον __repr__, ακόμα κι αν δεν το κάνετε defiβγαίνει έξω __str__.

Να πώς θα μπορούσαμε defiφινίρισμα __repr__ για το παράδειγμα της πίτσας μας:

κατηγορία πίτσα:
def __init__(self, size, toppings):
αυτο.μέγεθος = μέγεθος
self.toppings = γαρνιτούρες

def __repr__(self):
επιστροφή f"Pizza('{self.size}', {self.toppings})"

my_pizza = Πίτσα('μεγάλη', ['πεπερόνι', 'μανιτάρια'])
print(repr(my_pizza)) # Αυτό θα εκτυπώσει: Πίτσα ('μεγάλη', ['πεπερόνι', 'μανιτάρια'])

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

__Προσθήκη__

Στην Python, όλοι γνωρίζουμε ότι είναι δυνατή η προσθήκη αριθμών χρησιμοποιώντας τον τελεστή +, Όπως 3 + 5.

Τι γίνεται όμως αν θέλουμε να προσθέσουμε παρουσίες κάποιου προσαρμοσμένου αντικειμένου;

Η λειτουργία dunder __add__ μας επιτρέπει να κάνουμε ακριβώς αυτό. Μας δίνει τη δυνατότητα να defiσχολιάστε τη συμπεριφορά του χειριστή + στα εξατομικευμένα μας είδη.

Για λόγους συνέπειας, ας υποθέσουμε ότι το θέλουμε defiτελειώστε τη συμπεριφορά του + στο παράδειγμα της πίτσας μας. Ας πούμε ότι κάθε φορά που προσθέτουμε δύο ή περισσότερες πίτσες μαζί, θα συνδυάζει αυτόματα όλες τις επικαλύψεις τους. Δείτε πώς μπορεί να μοιάζει:

κατηγορία πίτσα:
def __init__(self, size, toppings):
αυτο.μέγεθος = μέγεθος
self.toppings = γαρνιτούρες

def __add__(self, other):
αν όχι για παράδειγμα (άλλο, πίτσα):
raise TypeError ("Μπορείτε να προσθέσετε μόνο άλλη πίτσα!")
new_toppings = self.toppings + other.toppings
επιστροφή πίτσα (self.size, new_toppings)

# Ας δημιουργήσουμε δύο πίτσες
pizza1 = Πίτσα ('μεγάλη', ['πεπερόνι', 'μανιτάρια'])
pizza2 = Πίτσα ('μεγάλη', ['ελιές', 'ανανάς'])

# Και ας τα «προσθέσουμε» τώρα
συνδυασμένη_πίτσα = πίτσα1 + πίτσα2

print(combined_pizza.toppings) # Αυτό θα εκτυπώσει: ['πεπερόνι', 'μανιτάρια', 'ελιές', 'ανανάς']

Ομοίως με το dunder __add__, μπορούμε επίσης defiτελειώνουμε άλλες αριθμητικές συναρτήσεις όπως π.χ __sub__ (με αφαίρεση χρησιμοποιώντας τον τελεστή -) Και __mul__ (για πολλαπλασιασμό με χρήση του τελεστή *).

__len__

Αυτή η μέθοδος dunder μας επιτρέπει defiτελειώσει τι τη λειτουργία len() πρέπει να επιστρέψει για τα προσαρμοσμένα προϊόντα μας.

Χρήσεις Python len() για να λάβετε το μήκος ή το μέγεθος μιας δομής δεδομένων, όπως μια λίστα ή μια συμβολοσειρά.

Στο πλαίσιο του παραδείγματός μας, θα μπορούσαμε να πούμε ότι το «μήκος» μιας πίτσας είναι ο αριθμός των επικαλύψεων που έχει. Δείτε πώς θα μπορούσαμε να το εφαρμόσουμε:

κατηγορία πίτσα:
def __init__(self, size, toppings):
αυτο.μέγεθος = μέγεθος
self.toppings = γαρνιτούρες

def __len__(self):
φακός επιστροφής (self.toppings)

# Ας δημιουργήσουμε μια πίτσα
my_pizza = Πίτσα('μεγάλη', ['πεπερόνι', 'μανιτάρια', 'ελιές'])

print(len(my_pizza)) # Αυτό θα εκτυπώσει: 3

Στη μέθοδο __len__, επιστρέφουμε μόνο το μήκος της λίστας toppings. Τώρα, len(my_pizza) θα μας πει πόσα toppings είναι πάνω του my_pizza.

__ επεξεργάζομαι, διαδικασία __

Αυτή η μέθοδος dunder επιτρέπει στα αντικείμενα να είναι επαναλαμβανόμενα, δηλαδή μπορεί να χρησιμοποιηθεί σε έναν βρόχο for.

Για να το κάνουμε αυτό, πρέπει επίσης defiολοκληρώστε τη λειτουργία __next__, Αυτό χρησιμοποιείται για definish τη συμπεριφορά που θα πρέπει να επιστρέψει την επόμενη τιμή στην επανάληψη. Θα πρέπει επίσης να σηματοδοτεί τον επαναληπτικό σε περίπτωση που δεν υπάρχουν άλλα στοιχεία στην ακολουθία. Αυτό συνήθως το πετυχαίνουμε βάζοντας μια εξαίρεση StopIteration.

Για το παράδειγμα της πίτσας μας, ας υποθέσουμε ότι θέλουμε να επαναλάβουμε τις επικαλύψεις. Θα μπορούσαμε να κάνουμε το μάθημα της πίτσας επαναλαμβανόμενο definendo μια μέθοδο __iter__:

κατηγορία πίτσα:
def __init__(self, size, toppings):
αυτο.μέγεθος = μέγεθος
self.toppings = γαρνιτούρες

def __iter__(self):
εαυτός.n = 0
επιστροφή του εαυτού

def __next__(self):
αν αυτο.ν < len(self.toppings):
αποτέλεσμα = self.toppings[self.n]
εαυτός.n += 1
αποτέλεσμα επιστροφής
αλλού:
αυξήστε το StopIteration

# Ας δημιουργήσουμε μια πίτσα
my_pizza = Πίτσα('μεγάλη', ['πεπερόνι', 'μανιτάρια', 'ελιές'])

# Και τώρα ας το επαναλάβουμε
για topping στην my_pizza:
εκτύπωση (κάλυμμα)

Σε αυτήν την περίπτωση, ο βρόχος for καλεί __iter__, που αρχικοποιεί έναν μετρητή (self.n) και επιστρέφει το ίδιο το αντικείμενο της πίτσας (self).

Στη συνέχεια, ο βρόχος for καλεί __next__ για να πάρει κάθε επικάλυψη με τη σειρά.

Όταν __next__ επέστρεψε όλα τα καρυκεύματα, StopIteration κάνει μια εξαίρεση και ο βρόχος for ξέρει τώρα ότι δεν υπάρχουν άλλα toppings και έτσι θα ματαιώσει τη διαδικασία επανάληψης.

Ercole Palmeri

Ενημερωτικό δελτίο καινοτομίας
Μην χάσετε τα πιο σημαντικά νέα για την καινοτομία. Εγγραφείτε για να τα λάβετε μέσω email.
Ετικέτες: Πύθων

Πρόσφατα άρθρα

Τα οφέλη των σελίδων χρωματισμού για παιδιά - ένας κόσμος μαγείας για όλες τις ηλικίες

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

2 Μαΐου 2024

Το μέλλον είναι εδώ: Πώς η ναυτιλιακή βιομηχανία φέρνει επανάσταση στην παγκόσμια οικονομία

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

1 Μαΐου 2024

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

Την περασμένη Δευτέρα, οι Financial Times ανακοίνωσαν συμφωνία με το OpenAI. Η FT αδειοδοτεί την παγκόσμιας κλάσης δημοσιογραφία της…

Απρίλιος 30 2024

Ηλεκτρονικές πληρωμές: Δείτε πώς οι υπηρεσίες ροής σας κάνουν να πληρώνετε για πάντα

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

Απρίλιος 29 2024

Διαβάστε την Καινοτομία στη γλώσσα σας

Ενημερωτικό δελτίο καινοτομίας
Μην χάσετε τα πιο σημαντικά νέα για την καινοτομία. Εγγραφείτε για να τα λάβετε μέσω email.

Seguici