Τα πάντα στο Python είναι ένα αντικείμενο ή έτσι ισχύει και το ρητό. Εάν θέλετε να δημιουργήσετε τα δικά σας προσαρμοσμένα αντικείμενα, με τις δικές τους ιδιότητες και μεθόδους, χρησιμοποιείτε το Python's τάξη
αντικείμενο για να γίνει αυτό. Όμως, η δημιουργία τάξεων στο Python μερικές φορές σημαίνει να γράφετε πολλά επαναλαμβανόμενα, boilerplate κώδικα για να ρυθμίσετε την παρουσία κλάσης από τις παραμέτρους που μεταβιβάζονται σε αυτήν ή για να δημιουργήσετε κοινές λειτουργίες όπως χειριστές σύγκρισης.
Τα Dataclasses, που εισήχθησαν στο Python 3.7 (και υποστηρίχθηκαν στο Python 3.6), παρέχουν έναν εύχρηστο τρόπο για να κάνουν τα μαθήματα λιγότερο λεκτικά. Πολλά από τα συνηθισμένα πράγματα που κάνετε σε μια τάξη, όπως η παρουσίαση ιδιοτήτων από τα επιχειρήματα που περνούν στην τάξη, μπορούν να μειωθούν σε μερικές βασικές οδηγίες.
Παράδειγμα βάσης δεδομένων Python
Εδώ είναι ένα απλό παράδειγμα συμβατικής τάξης στο Python:
βιβλίο της τάξης:Αντικείμενο για την παρακολούθηση φυσικών βιβλίων σε μια συλλογή. '' '
def __init __ (αυτο, όνομα: str, βάρος: float, shelf_id: int = 0):
self.name = όνομα
self.weight = βάρος # σε γραμμάρια, για τον υπολογισμό της αποστολής
self.shelf_id = shelf_id
def __repr __ (αυτο):
επιστροφή (f "Βιβλίο (όνομα = {self.name! r},
βάρος = {self.weight! r}, shelf_id = {self.shelf_id! r}) ")
Ο μεγαλύτερος πονοκέφαλος εδώ είναι ο τρόπος με τον οποίο πέρασαν τα επιχειρήματα__μέσα σε αυτό__
πρέπει να αντιγραφεί στις ιδιότητες του αντικειμένου. Αυτό δεν είναι τόσο άσχημα εάν ασχολείστε μόνοΒιβλίο
, αλλά τι γίνεται αν πρέπει να αντιμετωπίσετεΡάφι
, Βιβλιοθήκη
, Αποθήκη
, και ούτω καθεξής? Επιπλέον, όσο περισσότερος κωδικός πρέπει να πληκτρολογήσετε με το χέρι, τόσο μεγαλύτερες είναι οι πιθανότητες να κάνετε λάθος.
Εδώ είναι η ίδια τάξη Python, που εφαρμόζεται ως Pacthon dataclass:
από dataclasses import dataclass @ class class class
Όταν καθορίζετε ιδιότητες, ονομάζεταιπεδία, σε μια βάση δεδομένων,@dataclass
δημιουργεί αυτόματα όλο τον κώδικα που απαιτείται για την αρχικοποίησή τους. Διατηρεί επίσης τις πληροφορίες τύπου για κάθε ιδιότητα, οπότε αν χρησιμοποιείτε έναν κωδικό linter όπωςμυώδης
, θα διασφαλίσει ότι παρέχετε τα σωστά είδη μεταβλητών στον κατασκευαστή κλάσης.
Ενα άλλο πράγμα@dataclass
κάνει πίσω από τα παρασκήνια δημιουργεί αυτόματα κώδικα για έναν αριθμό κοινών μεθόδων dunder στην τάξη. Στην παραπάνω συμβατική τάξη, έπρεπε να δημιουργήσουμε τη δική μας__επιχειρημα
. Στην κλάση δεδομένων, αυτό είναι περιττό.@dataclass
παράγει το__επιχειρημα
για σενα.
Μόλις δημιουργηθεί ένα dataclass είναι λειτουργικά πανομοιότυπο με μια κανονική τάξη. Δεν υπάρχει ποινή απόδοσης για τη χρήση μιας κλάσης δεδομένων, εκτός από την ελάχιστη επιβάρυνση του διακοσμητή όταν δηλώνετε τον ορισμό της κατηγορίας.
Προσαρμόστε τα πεδία Python dataclass με τοπεδίο
λειτουργία
Ο προεπιλεγμένος τρόπος λειτουργίας των γυαλιών δεδομένων πρέπει να είναι εντάξει για τις περισσότερες περιπτώσεις χρήσης. Μερικές φορές, ωστόσο, πρέπει να ρυθμίσετε τον τρόπο με τον οποίο αρχικοποιούνται τα πεδία στην κλασική σας βάση δεδομένων. Για να το κάνετε αυτό, μπορείτε να χρησιμοποιήσετε τοπεδίο
λειτουργία.
από dataclasses εισαγωγή dataclass, πεδίο από την πληκτρολόγηση εισαγωγής List @dataclass class Βιβλίο: "" Αντικείμενο για παρακολούθηση φυσικών βιβλίων σε μια συλλογή. "" Όνομα: str condition: str = field (σύγκριση = False) βάρος: float = πεδίο (προεπιλογή = 0,0, repr = False) shelf_id: int = 0 κεφάλαια: Λίστα [str] = πεδίο (default_factory = list)
Όταν ορίζετε μια προεπιλεγμένη τιμή σε μια παρουσία τουπεδίο
, αλλάζει τον τρόπο ρύθμισης του πεδίου ανάλογα με τις παραμέτρους που δίνετεπεδίο
. Αυτές είναι οι πιο συχνά χρησιμοποιούμενες επιλογές για πεδίο
(υπάρχουν άλλοι):
Προκαθορισμένο
: Ορίζει την προεπιλεγμένη τιμή για το πεδίο. Πρέπει να χρησιμοποιήσετεΠροκαθορισμένο
εάν χρησιμοποιείτε)πεδίο
για να αλλάξετε οποιεσδήποτε άλλες παραμέτρους για το πεδίο, και β) θέλετε να ορίσετε μια προεπιλεγμένη τιμή στο πεδίο πάνω από αυτό. Σε αυτήν την περίπτωση χρησιμοποιούμεΠροκαθορισμένο
να ορίσειβάρος
προς την0.0
.προεπιλεγμένο εργοστάσιο
: Παρέχει το όνομα μιας συνάρτησης, η οποία δεν λαμβάνει παραμέτρους, που επιστρέφει κάποιο αντικείμενο για να χρησιμοποιηθεί ως η προεπιλεγμένη τιμή για το πεδίο. Σε αυτήν την περίπτωση, θέλουμεΚεφάλαια
να είναι μια κενή λίστα.αναφ
: Από προεπιλογή (Αληθής
), ελέγχει εάν το εν λόγω πεδίο εμφανίζεται αυτόματα__επιχειρημα
για την κλάση δεδομένων. Σε αυτήν την περίπτωση δεν θέλουμε το βάρος του βιβλίου να εμφανίζεται στο__επιχειρημα
, έτσι χρησιμοποιούμεrepr = Λάθος
να το παραλείψω.συγκρίνω
: Από προεπιλογή (Αληθής
), περιλαμβάνει το πεδίο στις μεθόδους σύγκρισης που δημιουργούνται αυτόματα για την κλάση δεδομένων. Εδώ, δεν θέλουμεκατάσταση
για να χρησιμοποιηθούν ως μέρος της σύγκρισης για δύο βιβλία, έτσι ορίσαμεσύγκριση =
Ψευδής
.
Σημειώστε ότι έπρεπε να προσαρμόσουμε τη σειρά των πεδίων έτσι ώστε τα μη προεπιλεγμένα πεδία να είναι πρώτα.
Χρήση__ post_init__
για τον έλεγχο της αρχικοποίησης της βάσης δεδομένων Python
Σε αυτό το σημείο πιθανώς αναρωτιέστε: Εάν το__μέσα σε αυτό__
Η μέθοδος μιας κλάσης δεδομένων δημιουργείται αυτόματα, πώς μπορώ να ελέγξω τη διαδικασία init για να κάνω λεπτότερες αλλαγές;
Εισάγετε το__ post_init__
μέθοδος. Εάν συμπεριλάβετε το__ post_init__
μέθοδος στον ορισμό της βάσης δεδομένων σας, μπορείτε να παρέχετε οδηγίες για τροποποίηση πεδίων ή άλλων δεδομένων παρουσίας.
από dataclasses import dataclass, πεδίο από πληκτρολόγηση εισαγωγής List @dataclass class Βιβλίο: "" Αντικείμενο για παρακολούθηση φυσικών βιβλίων σε μια συλλογή. "" Όνομα: str weight: float = field (default = 0,0, repr = False) shelf_id: int = πεδίο (init = False) κεφάλαια: List [str] = field (default_factory = list) condition: str = field (default = "Good", membandingkan = False) def __post_init __ (self): if self.condition == "Απορρίφθηκε ": self.shelf_id = Κανένα άλλο: self.shelf_id = 0
Σε αυτό το παράδειγμα, έχουμε δημιουργήσει ένα__ post_init__
μέθοδος για ρύθμιση shelf_id
προς τηνΚανένας
εάν η κατάσταση του βιβλίου έχει αρχικοποιηθεί ως"Απορρίφθηκε"
. Σημειώστε πώς χρησιμοποιούμεπεδίο
για αρχικοποίησηshelf_id
και περάστεμέσα σε αυτό
όπως καιΨευδής
προς τηνπεδίο
. Αυτό σημαίνειshelf_id
δεν θα αρχικοποιηθεί στα__μέσα σε αυτό__
.
ΧρήσηInitVar
για τον έλεγχο της αρχικοποίησης της βάσης δεδομένων Python
Ένας άλλος τρόπος για να προσαρμόσετε τη ρύθμιση της βάσης δεδομένων Python είναι να χρησιμοποιήσετε τοInitVar
τύπος. Αυτό σας επιτρέπει να καθορίσετε ένα πεδίο στο οποίο θα περάσετε__μέσα σε αυτό__
και μετά να__ post_init__
, αλλά δεν θα αποθηκευτούν στην παρουσία τάξης.
Με τη χρήση InitVar
, μπορείτε να λάβετε παραμέτρους κατά τη ρύθμιση της κλάσης δεδομένων που χρησιμοποιούνται μόνο κατά την προετοιμασία. Ενα παράδειγμα:
από dataclasses import dataclass, field, InitVar από την πληκτρολόγηση εισαγωγής List @dataclass class Book: '' 'Αντικείμενο παρακολούθησης φυσικών βιβλίων σε μια συλλογή.' '' Όνομα: str condition: InitVar [str] = Κανένα βάρος: float = field (προεπιλογή = 0,0, repr = False) shelf_id: int = field (init = False) κεφάλαια: Λίστα [str] = πεδίο (default_factory = list) def __post_init __ (self, condition): if condition == "Discarded": self.shelf_id = Κανένα άλλο: self.shelf_id = 0
Ορισμός τύπου πεδίου σεInitVar
(με τον υποτύπο του να είναι ο πραγματικός τύπος πεδίου)@dataclass
να μην κάνουμε αυτό το πεδίο σε πεδίο κλάσης δεδομένων, αλλά να μεταφέρουμε τα δεδομένα στο__ post_init__
ως επιχείρημα.
Σε αυτήν την έκδοση του δικού μαςΒιβλίο
τάξη, δεν αποθηκεύουμεκατάσταση
ως πεδίο στην παρουσία τάξης. Χρησιμοποιούμε μόνο κατάσταση
κατά τη φάση της αρχικοποίησης. Αν το βρούμε αυτόκατάσταση
ορίστηκε σε"Απορρίφθηκε"
, ορίσαμεshelf_id
προς τηνΚανένας
- αλλά δεν αποθηκεύουμεκατάσταση
στην παρουσία τάξης.
Πότε να χρησιμοποιείτε γυαλιά ηλίου Python - και πότε να μην τα χρησιμοποιείτε
Ένα κοινό σενάριο για τη χρήση γυαλιών ηλίου είναι ως αντικατάσταση του ονόματοςtuple. Τα γυαλιά ηλίου προσφέρουν τις ίδιες συμπεριφορές και πολλά άλλα, και μπορούν να γίνουν αμετάβλητα (όπως ονομαζόμαστε άλλοι) χρησιμοποιώντας απλά@dataclass (κατεψυγμένο = True)
ως διακοσμητής.
Μια άλλη πιθανή περίπτωση χρήσης είναι η αντικατάσταση ένθετων λεξικών, τα οποία μπορεί να είναι αδέξια για εργασία, με ένθετα στιγμιότυπα από γυαλιά δεδομένων. Εάν έχετε μια βάση δεδομένωνΒιβλιοθήκη
, με μια ιδιότητα λίσταςράφια
, θα μπορούσατε να χρησιμοποιήσετε μια κλάση δεδομένωνΑναγνωστήριο
για να συμπληρώσετε αυτήν τη λίστα και, στη συνέχεια, να προσθέσετε μεθόδους για να διευκολύνετε την πρόσβαση σε ένθετα στοιχεία (π.χ. ένα βιβλίο σε ένα ράφι σε ένα συγκεκριμένο δωμάτιο).
Όμως, δεν πρέπει κάθε τάξη Python να είναι μια κλάση δεδομένων. Εάν δημιουργείτε μια τάξη κυρίως ως τρόπο ομαδοποίησης πολλώνστατικές μεθόδους, και όχι ως κοντέινερ για δεδομένα, δεν χρειάζεται να το κάνετε ως βάση δεδομένων. Για παράδειγμα, ένα συνηθισμένο μοτίβο με το πρόγραμμα ανάλυσης είναι να υπάρχει μια κλάση που λαμβάνει ένα δέντρο σύνταξης αφηρημένη, περπατά το δέντρο και αποστέλλει κλήσεις σε διαφορετικές μεθόδους στην τάξη με βάση τον τύπο κόμβου. Επειδή η κλάση parser έχει πολύ λίγα δεδομένα από μόνη της, ένα dataclass δεν είναι χρήσιμο εδώ.
Πώς να κάνετε περισσότερα με την Python
- Ξεκινήστε με το async στο Python
- Πώς να χρησιμοποιήσετε το asyncio στο Python
- Πώς να χρησιμοποιήσετε το PyInstaller για να δημιουργήσετε εκτελέσιμα Python
- Εκμάθηση Cython: Πώς να επιταχύνετε το Python
- Πώς να εγκαταστήσετε το Python με τον έξυπνο τρόπο
- Πώς να διαχειριστείτε τα έργα Python με το Poetry
- Πώς να διαχειριστείτε τα έργα Python με το Pipenv
- Virtualenv και venv: Εξηγήθηκαν εικονικά περιβάλλοντα Python
- Το Python virtualenv και το venv κάνουν και δεν πρέπει
- Η εξήγηση και οι υποεπεξεργασίες Python εξηγούνται
- Πώς να χρησιμοποιήσετε το πρόγραμμα εντοπισμού σφαλμάτων Python
- Πώς να χρησιμοποιήσετε το χρονοδιάγραμμα για τον προφίλ κώδικα Python
- Πώς να χρησιμοποιήσετε το cProfile για να προβάλετε τον κώδικα Python
- Πώς να μετατρέψετε το Python σε JavaScript (και να επιστρέψετε ξανά)