Πίνακας περιεχομένων[Κρύβω][Προβολή]
Σε αυτή τη διάλεξη, θα μάθουμε για τις κλάσεις, τους κατασκευαστές και την κληρονομικότητα στον python.
Αυτές οι έννοιες είναι πραγματικά σημαντικές σε ένα μεγάλο πρόγραμμα όπου χρειάζεται να οριστούν διαφορετικοί τύποι.
μαθήματα
Οι τάξεις είναι απαραίτητες στον προγραμματισμό και δεν είναι συγκεκριμένες για την python. Πολλά άλλα γλώσσες προγραμματισμού υποστηρίζουν την έννοια των τάξεων. Χρησιμοποιούμε κλάσεις για να ορίσουμε νέους τύπους δεδομένων.
Μέχρι στιγμής, μάθαμε για τους βασικούς τύπους δεδομένων στην Python, όπως αριθμούς, συμβολοσειρές και booleans. Αυτοί είναι οι βασικοί ή απλοί τύποι δεδομένων στην Python. Έχουμε δει επίσης μερικούς πολύπλοκους τύπους δεδομένων όπως λίστες και λεξικά.
Αν και αυτοί οι τύποι είναι εξαιρετικά χρήσιμοι, δεν μπορούν πάντα να χρησιμοποιηθούν για τη μοντελοποίηση περίπλοκων εννοιών. Για παράδειγμα, σκεφτείτε την ιδέα ενός σημείου ή ενός καλαθιού αγορών. Ένα καλάθι αγορών δεν είναι ένα boolean ή μια λίστα. Είναι άλλου είδους δεδομένα. Έτσι μπορούμε να χρησιμοποιήσουμε κλάσεις για να ορίσουμε νέους τύπους για να μοντελοποιήσουμε πραγματικές έννοιες.
Τώρα, ας ορίσουμε έναν νέο τύπο δεδομένων που ονομάζεται σημείο. Αυτός ο νέος τύπος θα έχει μεθόδους όπως ελέγξαμε προηγουμένως.
Έτσι θα το κάνετε:
Ξεκινάμε ορίζοντας μια τάξη χρησιμοποιώντας τη λέξη-κλειδί «class» και αμέσως μετά δίνουμε στην τάξη μας ένα όνομα.
class Point
Τώρα, δείτε τη σύμβαση ονομασίας που χρησιμοποίησα εδώ. Έχω γράψει κεφαλαία το πρώτο γράμμα εδώ, αυτό είναι αυτό που ονομάζουμε σύμβαση ονομασίας pascal. Αυτή η σύμβαση είναι διαφορετική από αυτήν που χρησιμοποιούμε για την ονομασία των μεταβλητών και των συναρτήσεών μας για τις οποίες χρησιμοποιούμε πάντα πεζά γράμματα και διαχωρίζουμε πολλές λέξεις χρησιμοποιώντας μια υπογράμμιση. Αλλά όταν ονομάζουμε τάξεις, δεν χρησιμοποιούμε υπογράμμιση για να διαχωρίσουμε πολλές λέξεις, αλλά πληκτρολογούμε το πρώτο γράμμα κάθε λέξης.
Αφού ορίσουμε την κλάση μας, χρησιμοποιείται άνω και κάτω τελεία που σημαίνει ότι τώρα ορίζεται ένα μπλοκ.
class Point:
def move (self):
Σε αυτό το μπλοκ, μπορούμε να ορίσουμε όλες τις συναρτήσεις ή τις μεθόδους που ανήκουν σε σημεία. Για παράδειγμα, μπορούμε να ορίσουμε μια συνάρτηση που ονομάζεται "move" για τη μετακίνηση ενός σημείου. Λάβετε υπόψη ότι μόλις πληκτρολογήσουμε ανοιχτή παρένθεση, το PyCharm προσθέτει αυτόματα το "self" εδώ. Αυτή είναι μια ειδική λέξη-κλειδί και επιτρέψτε μου να επανέλθω σύντομα σε αυτήν. Ας τυπώσουμε το "move" στο τερματικό.
print("move")
Ας ορίσουμε μια άλλη μέθοδο, όπως "σχεδίαση" και ας την εκτυπώσουμε στο τερματικό.
def draw(self):
print("draw")
Τελειώσαμε με τον ορισμό της κλάσης "σημείο". Με αυτόν τον νέο τύπο, μπορούμε να δημιουργήσουμε νέα αντικείμενα. Μια κλάση απλώς ορίζει το σχεδιάγραμμα ή το πρότυπο για τη δημιουργία αντικειμένων που είναι οι πραγματικές παρουσίες που βασίζονται σε αυτό το σχέδιο. Για να δημιουργήσουμε ένα αντικείμενο, πληκτρολογούμε το όνομα της κλάσης μας και στη συνέχεια το καλούμε όπως μια συνάρτηση. Αυτό δημιουργεί ένα νέο αντικείμενο και στη συνέχεια το επιστρέφει. Τότε μπορούμε να αποθηκεύσουμε αυτό το αντικείμενο σε μια μεταβλητή. Επιτρέψτε μου να σας δείξω:
Εδώ έχουμε ορίσει ένα «σημείο1» που είναι ένα τρισδιάστατο σημείο. Μπορείτε να δείτε ότι, μπορούμε να εκτυπώσουμε μεμονωμένες συντεταγμένες στο τερματικό.
Μπορούμε να χρησιμοποιήσουμε τις δύο μεθόδους «ζωγράφιση» και «μετακίνηση» με αυτό το σημείο.
Έτσι για να ανακεφαλαιώσουμε, χρησιμοποιούμε κλάσεις για να ορίσουμε νέους τύπους και αυτοί οι τύποι μπορούν να έχουν μεθόδους που ορίζουμε στο σώμα της κλάσης. Οι τάξεις μπορεί να έχουν χαρακτηριστικά που μπορούμε να ορίσουμε οπουδήποτε στα προγράμματά μας.
Κατασκευαστές
Μέχρι στιγμής, μάθαμε πώς να δημιουργούμε νέους τύπους χρησιμοποιώντας κλάσεις. Τώρα υπάρχει ένα μικρό πρόβλημα με αυτήν την υλοποίηση. Μπορούμε να δημιουργήσουμε ένα σημειακό αντικείμενο χωρίς συντεταγμένες x ή y χρησιμοποιώντας κλάσεις και αυτό δεν είναι ιδανικό. Επιτρέψτε μου να σας δείξω.
Ας δημιουργήσουμε ένα σημείο και ας το εκτυπώσουμε πριν ορίσουμε τη συντεταγμένη x. Η εκτέλεση του προγράμματός μας οδηγεί σε ένα σφάλμα χαρακτηριστικών όπως αυτό:
Σημαίνει ότι το σημείο αντικείμενο δεν έχει καμία ιδιότητα που ονομάζεται x. Τώρα το πρόβλημα είναι ότι είναι δυνατό να έχουμε ένα σημειακό αντικείμενο χωρίς συντεταγμένες x ή y. Αυτό δεν έχει νόημα καθώς κάθε φορά που μιλάμε για ένα σημείο, πρέπει να ξέρουμε πού βρίσκεται αυτό το σημείο. Για να λύσουμε αυτό το πρόβλημα, χρησιμοποιούμε έναν κατασκευαστή. Ένας κατασκευαστής είναι μια συνάρτηση που καλείται τη στιγμή της δημιουργίας ενός αντικειμένου.
Εδώ είναι πώς χρησιμοποιούμε έναν κατασκευαστή. Αρχικά, ας περάσουμε τις τιμές των συντεταγμένων x και y στο παραπάνω πρόγραμμα.
point = Point(10, 20)
print(point.x)
Τώρα, πρέπει να προσθέσουμε μια ειδική μέθοδο σε αυτήν την κλάση που ονομάζεται κατασκευαστής. Η σύνταξή του έχει ως εξής:
def __init__(self, x, y):
init
είναι συντομογραφία για αρχικοποιημένο, και αυτή είναι η συνάρτηση ή η μέθοδος που καλείται όταν δημιουργείται ένα νέο αντικείμενο σημείου. Το x και το y προστίθενται αμέσως μετά self
για να προσθέσετε δύο επιπλέον παραμέτρους.
Μετά από αυτό, θα πρέπει να αντιστοιχίσουμε τα x και y στις περασμένες τιμές, δηλαδή 10 και 20
self.x = x
self.y = y
Χρησιμοποιούμε το self
να αναφερθούμε στο τρέχον αντικείμενο και στη συνέχεια ορίζουμε το χαρακτηριστικό x στο όρισμα x που μεταβιβάζεται στη συνάρτηση «x». Με αυτόν τον τρόπο, χρησιμοποιώντας init
μέθοδο, μπορούμε να αρχικοποιήσουμε τα αντικείμενά μας. Αυτή η μέθοδος αναφέρεται ως κατασκευαστής. Ας τρέξουμε το πρόγραμμά μας.
Τώρα, μπορούμε να αλλάξουμε τις συντεταγμένες x και y αργότερα. Ας ενημερώσουμε τις συντεταγμένες x:
point = Point(10, 20)
point.x = 11
print(point.x)
Τώρα, η συντεταγμένη x ενημερώνεται στην τιμή 11.
Άσκηση
Εδώ είναι μια ενδιαφέρουσα άσκηση για εσάς.
Θέλω να ορίσετε έναν νέο τύπο που ονομάζεται άτομο. Αυτά τα αντικείμενα "Person" πρέπει να έχουν "name
"ιδιότητα καθώς και ένα "talk()
Μέθοδος.
Είναι μια απλή εργασία και δεν πρέπει να διαρκέσει περισσότερο από μερικά λεπτά.
Λύση
Ξεκινήστε ορίζοντας την κλάση "Person" ως εξής:
class Person:
self.name = name
Θα ορίσουμε τον κατασκευαστή αργότερα. Τώρα, μπορούμε να δημιουργήσουμε το αντικείμενο "Person". Ας το πούμε Γιάννη
john = Person("John Smith")
print(john.name)
john.talk()
Τώρα, προχωρήστε στο πρώτο τμήμα του κώδικα και δημιουργήστε έναν κατασκευαστή.
def __init__(self, name):
Ο τελικός κώδικας θα μοιάζει με αυτό:
Μπορείτε επίσης να χρησιμοποιήσετε μορφοποιημένες συμβολοσειρές και άλλες έννοιες σε συνδυασμό με κλάσεις και κατασκευαστές.
Κληρονομία
Η κληρονομικότητα είναι μια άλλη έννοια που σχετίζεται με κλάσεις που σας επιτρέπουν να επαναχρησιμοποιήσετε έναν κώδικα.
Σκεφτείτε αυτό το κομμάτι κώδικα.
class Dog:
def walk(self):
print("walk")
Δημιουργήσαμε μια κλάση «Σκύλος» με τη μέθοδο «βόλτα». Σε αυτήν τη μέθοδο, απλώς εκτυπώνουμε το μήνυμα πεζοπορίας στο τερματικό. Ας πούμε, σε ένα πραγματικό πρόγραμμα, υπάρχουν 10 γραμμές κώδικα αντί για μία μόνο γραμμή εδώ. Στο μέλλον, εάν χρειαστεί μια άλλη κλάση για να έχουμε τη μέθοδο "walk", θα πρέπει να επαναλάβουμε όλο αυτόν τον κώδικα. Αυτό δεν είναι ιδανικό.
Στον προγραμματισμό, έχουμε μια αρχή που ονομάζεται DRY, η οποία είναι συντομογραφία του μην επαναλαμβάνεσαι. Ας πούμε ότι κάποια στιγμή στο μέλλον, θα ανακαλύψουμε ένα πρόβλημα με τη μέθοδο "περπάτημα" μας και εάν έχουμε επαναλάβει ή επαναλάβει αυτήν τη μέθοδο σε πολλά άλλα μέρη, θα πρέπει να επιστρέψουμε και να διορθώσουμε αυτό το πρόβλημα σε κάθε μέρος που το έχουμε αντιγράψει κώδικας. Γι' αυτό στον προγραμματισμό δεν πρέπει να ορίζουμε κάτι δύο φορές.
Υπάρχουν διαφορετικές προσεγγίσεις για την επίλυση αυτού του προβλήματος, αλλά εδώ θα μάθουμε αυτή που είναι πιο εύκολη για αρχάριους και ονομάζεται κληρονομικότητα. Σε αυτήν την περίπτωση, θα δημιουργήσουμε μια άλλη κλάση "θηλαστικό" και θα ορίσουμε το χαρακτηριστικό "walk" μας σε αυτήν την κλάση.
class Mammal:
def walk(self):
print("walk")
Αφού ορίσουμε την κλάση "Mammal", μπορούμε να χρησιμοποιήσουμε την κληρονομικότητα για να μεταβιβάσουμε τα χαρακτηριστικά ως εξής:
Και οι δύο κατηγορίες σκύλων και γατών κληρονομούν όλες τις μεθόδους κλάσης που ορίζονται στη γονική τους τάξη. Τώρα, μπορούμε να προσθέσουμε μεθόδους ειδικά για σκύλους όπως αυτή:
class Dog:
def bark(self):
print("bark")
Τύλιξε!
Όλα αυτά αφορούσαν τις κλάσεις, τους κατασκευαστές και την επαναχρησιμοποίηση του κώδικα σε κλάσεις με έννοιες κληρονομικότητας. Τώρα πλησιάζουμε στο τέλος της σειράς μας. Σε αυτό το σημείο, θα πρέπει να είστε σε θέση να παράγετε καλούς, ευανάγνωστους και συνοπτικούς κώδικες στην Python.
Θα δούμε την έννοια των ενοτήτων και των πακέτων στην επόμενη διάλεξη.
Αφήστε μια απάντηση