Μαθαίνω τη γλώσσα προγραμματισμού Python και συνάντησα κάτι που δεν καταλαβαίνω πλήρως.
Σε μια μέθοδο όπως:
def method(self, blah):
def __init__(?):
....
....
Τι κάνει η self
; Τι είναι αυτό που πρέπει να είναι; Είναι υποχρεωτικό;
Τι κάνει η μέθοδος __init__
; Γιατί είναι απαραίτητη; (κ.λπ.)
Νομίζω ότι μπορεί να είναι κατασκευές OOP, αλλά δεν ξέρω πολλά.
Σε αυτόν τον κώδικα:
class A(object):
def __init__(self):
self.x = 'Hello'
def method_a(self, foo):
print self.x + ' ' + foo
... η μεταβλητή self
αντιπροσωπεύει την ίδια την περίπτωση του αντικειμένου. Οι περισσότερες αντικειμενοστρεφείς γλώσσες την περνούν ως κρυφή παράμετρο στις μεθόδους που ορίζονται σε ένα αντικείμενο- η Python δεν το κάνει. Πρέπει να τη δηλώσετε ρητά. Όταν δημιουργείτε ένα παράδειγμα της κλάσης A
και καλείτε τις μεθόδους της, θα περάσει αυτόματα, όπως στην ...
a = A() # We do not pass any argument to the __init__ method
a.method_a('Sailor!') # We only pass a single argument
Η μέθοδος __init__
είναι περίπου αυτό που αντιπροσωπεύει έναν κατασκευαστή στην Python. Όταν καλείτε την A()
η Python δημιουργεί ένα αντικείμενο για εσάς, και το περνάει ως πρώτη παράμετρο στη μέθοδο __init__
. Τυχόν πρόσθετες παράμετροι (π.χ. A(24, 'Hello')
) θα περάσουν επίσης ως ορίσματα--στην περίπτωση αυτή προκαλείται η εμφάνιση μιας εξαίρεσης, αφού ο κατασκευαστής δεν τις περιμένει.
Ναι, έχετε δίκιο, πρόκειται για κατασκευές του oop.
Το "init" είναι ο κατασκευαστής μιας κλάσης. Η παράμετρος self
αναφέρεται στην περίπτωση του αντικειμένου (όπως this
στη C++).
class Point:
def __init__(self, x, y):
self._x = x
self._y = y
Η μέθοδος __init__
καλείται όταν η μνήμη για το αντικείμενο κατανέμεται:
x = Point(1,2)
Είναι σημαντικό να χρησιμοποιείτε την παράμετρο self
μέσα σε μια μέθοδο αντικειμένου'αν θέλετε να διατηρήσετε την τιμή με το αντικείμενο. Αν, για παράδειγμα, υλοποιήσετε τη μέθοδο __init__
ως εξής:
class Point:
def __init__(self, x, y):
_x = x
_y = y
Οι παράμετροι x
και y
σας θα αποθηκεύονται σε μεταβλητές στη στοίβα και θα απορρίπτονται όταν η μέθοδος init βγαίνει εκτός εμβέλειας. Ορίζοντας αυτές τις μεταβλητές ως self._x
και self._y
θέτει αυτές τις μεταβλητές ως μέλη του αντικειμένου Point
(προσβάσιμες για τη διάρκεια ζωής του αντικειμένου).
Το __init__
ενεργεί σαν κατασκευαστής. Θα πρέπει να περάσετε την "self" σε κάθε συνάρτηση της κλάσης ως πρώτο όρισμα αν θέλετε να συμπεριφέρονται ως μη στατικές μέθοδοι. "self" είναι μεταβλητές παραδείγματος για την κλάση σας.