Co robią __init__ i self w Pythonie?

Ja'uczę się języka programowania Python i'natknąłem się na coś, czego'nie do końca rozumiem.

W metodzie takiej jak:

def method(self, blah):
    def __init__(?):
        ....
    ....

Co robi self? Czym ma być? Czy jest obowiązkowe?

Co robi metoda __init__? Dlaczego jest konieczna? (etc.)

Wydaje mi się, że mogą to być konstrukcje OOP, ale nie wiem zbyt wiele.

W tym kodzie:

class A(object):
    def __init__(self):
        self.x = 'Hello'

    def method_a(self, foo):
        print self.x + ' ' + foo

... zmienna self reprezentuje instancję samego obiektu. Większość języków zorientowanych obiektowo przekazuje ją jako ukryty parametr do metod zdefiniowanych na obiekcie; Python tego nie robi. Musisz ją jawnie zadeklarować. Kiedy tworzysz instancję klasy A i wywołujesz jej metody, zostanie ona przekazana automatycznie, jak w ...

a = A()               # We do not pass any argument to the __init__ method
a.method_a('Sailor!') # We only pass a single argument

Metoda __init__ jest w przybliżeniu tym, co reprezentuje konstruktor w Pythonie. Kiedy wywołujesz A(), Python tworzy dla Ciebie obiekt i przekazuje go jako pierwszy parametr do metody __init__. Wszelkie dodatkowe parametry (np. A(24, 'Hello')) również zostaną przekazane jako argumenty - w tym przypadku powodując zgłoszenie wyjątku, ponieważ konstruktor ich nie oczekuje.

Komentarze (3)

Yep, masz rację, to są konstrukcje oop.

__init__ jest konstruktorem dla klasy. Parametr self odnosi się do instancji obiektu (jak this w C++).

class Point:
    def __init__(self, x, y):
        self._x = x
        self._y = y

Metoda __init__ jest wywoływana, gdy pamięć dla obiektu jest alokowana:

x = Point(1,2)

Ważne jest, aby używać parametru self wewnątrz metody obiektu'jeśli chcesz, aby wartość była trwale związana z obiektem. Jeśli, na przykład, zaimplementujesz metodę __init__ w ten sposób:

class Point:
    def __init__(self, x, y):
        _x = x
        _y = y

Twoje parametry x i y byłyby przechowywane w zmiennych na stosie i zostałyby odrzucone, gdy metoda init wyjdzie poza zakres. Ustawienie tych zmiennych jako self._x i self._y ustawia te zmienne jako członków obiektu Point (dostępnych przez cały czas życia obiektu).

Komentarze (1)

__init__ zachowuje się jak konstruktor. Będziesz musiał przekazać "self" do każdej funkcji klasy jako pierwszy argument, jeśli chcesz, aby zachowywały się one jak metody niestatyczne. "self" są zmiennymi instancji dla twojej klasy.

Komentarze (1)