self

Pierwszy parametr metody: obiekt, na którym metodę wywołano. Daje dostęp do jego atrybutów i innych metod.

Na tej stronie

Przykład

#
Python
class Student:
    def __init__(self, name):
        self.name = name
        self.points = 0

    def add_points(self, amount):
        self.points += amount
        return self.summary()

    def summary(self):
        return f"{self.name}: {self.points} pkt"

ania = Student("Ania")
kuba = Student("Kuba")

print(ania.add_points(30))
print(kuba.add_points(10))
print(Student.add_points(ania, 5))
Wynikzapisany wynik, możesz go sprawdzić
Ania: 30 pkt
Kuba: 10 pkt
Ania: 35 pkt

Definicja i zastosowanie

#

Każda zwykła metoda klasy dostaje jako pierwszy argument obiekt, na którym ją wywołano. Zwyczajowo ten parametr nazywa się self. Przez niego metoda odczytuje i zmienia dane konkretnego obiektu: self.points += 10 dodaje punkty tylko temu uczniowi, dla którego wywołano metodę.

Wywołanie ania.add_points(10) Python zamienia na Student.add_points(ania, 10). Dlatego definicja metody ma o jeden parametr więcej niż jej wywołanie: obiekt sprzed kropki trafia do self automatycznie. Z tego samego powodu wewnątrz metody inne metody i atrybuty tego obiektu zapisujesz z przedrostkiem self., np. self.summary().

self nie jest słowem kluczowym, tylko powszechnie przestrzeganą umową. Parametr mógłby się nazywać inaczej, ale taki kod byłby mylący dla każdego czytelnika. W przeciwieństwie do this w JavaScripcie czy Javie, self trzeba jawnie wpisać jako pierwszy parametr każdej zwykłej metody.

Atrybut przypisany przez self.nazwa = ... należy do jednego obiektu. Zmienna zapisana bezpośrednio w ciele klasy jest atrybutem klasy, wspólnym dla wszystkich jej obiektów. Odczyt self.nazwa sprawdza najpierw obiekt, a potem klasę, ale przypisanie przez self tworzy albo zmienia atrybut samego obiektu, a atrybut klasy zostaje bez zmian.

Składnia

#
Składnia
class Nazwa:
    def metoda(self, argument):
        self.atrybut = argument
        return self.inna_metoda()

obiekt.metoda(argument)

Więcej przykładów

#
Atrybuty klasy i atrybuty obiektu
Python
class Student:
    school = "CodeWorlds"
    count = 0

    def __init__(self, name):
        self.name = name
        Student.count += 1

ania = Student("Ania")
kuba = Student("Kuba")
kuba.school = "Szkoła nr 5"

print(ania.school, kuba.school, Student.school)
print(Student.count, vars(kuba))
Wynikzapisany wynik, możesz go sprawdzić
CodeWorlds Szkoła nr 5 CodeWorlds
2 {'name': 'Kuba', 'school': 'Szkoła nr 5'}
Brakujący self w definicji
Python
class Lesson:
    def start():
        return "Start lekcji"

try:
    Lesson().start()
except TypeError as error:
    print(error)
Wynikzapisany wynik, możesz go sprawdzić
Lesson.start() takes 0 positional arguments but 1 was given

Python przekazał obiekt jako pierwszy argument, a metoda nie miała parametru, który by go przyjął.

Dobre praktyki

#
  • Pierwszy parametr zwykłej metody nazywaj zawsze self. Tę konwencję rozpoznają edytory, lintery i wszyscy czytelnicy kodu.
  • Komunikat „takes 0 positional arguments but 1 was given” przy wywołaniu metody zwykle oznacza, że w jej definicji zabrakło self.
  • Wspólne liczniki i ustawienia zmieniaj przez nazwę klasy, np. Student.count += 1. Przypisanie przez self utworzy osobny atrybut tylko w jednym obiekcie.

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.