self
Pierwszy parametr metody: obiekt, na którym metodę wywołano. Daje dostęp do jego atrybutów i innych metod.
Przykład
#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))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
#class Nazwa:
def metoda(self, argument):
self.atrybut = argument
return self.inna_metoda()
obiekt.metoda(argument)Więcej przykładów
#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))class Lesson:
def start():
return "Start lekcji"
try:
Lesson().start()
except TypeError as error:
print(error)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 przezselfutworzy osobny atrybut tylko w jednym obiekcie.
Powiązane hasła
#- classDefiniuje klasę: szablon obiektów łączący dane i funkcje, które na nich działają.
- __init__()Metoda wywoływana automatycznie przy tworzeniu obiektu. Zapisuje w nim dane początkowe, czyli atrybuty.
- @classmethodMetoda, która zamiast obiektu dostaje klasę (cls). Najczęściej służy jako alternatywny konstruktor.
- @staticmethodMetoda, która nie dostaje automatycznie ani obiektu, ani klasy. Działa jak zwykła funkcja umieszczona w klasie.
- @propertyZamienia metodę w atrybut: wartość jest wyliczana przy odczycie, a opcjonalny setter kontroluje zapis.
Widzisz błąd albo brakuje przykładu? Napisz do nas.