Rozdział 14 · Tworzenie rzeczywistych obiektów
self i metody łączenia
rex.layat() i Sobaka.layat(rex) to to samo wyzwanie. Sprawdźmy, skąd self naprawdę się bierze.
Dwa równoważne nagrania tego samego wezwania
rex.layat() nie jest jedynym sposobem nazywania tej metody.
To samo wywołanie można zapisać przez klasę, przekazując obiekt ręcznie pierwszym argumentem:
Ta sama akcja – dwa sposoby nagrywania
Przez Obiekt (Normalny wpis)
rex.layat()
Przez zajęcia (co naprawdę się dzieje)
Sobaka.layat(rex)
Co używać dzisiaj: Na piśmie zawsze używaj notacji przez dopełnienie —
rex.layat(). Druga forma jest pokazana tylko po to, aby było widać, skąd się bierze self: To właśnie jest rexautomatycznie przeszedł jako pierwszy argument.co się dzieje, gdy dzwonisz rex.layat()
self — znów nie jest słowem kluczowym
Jak już wspomniano w rozdziale 14.3:
self — to po prostu nazwa pierwszego parametru metody, wybrana konwencją. Python podstawia w niego obiekt po lewej od kropki NIEZALEŻNIE od tego, jak go nazwiesz — ale nazywaj go self zawsze, to jedyna nazwa, której oczekuje każdy, kto czyta kod w Python.Debug Lab 1: Zapomniałem self w definicji metody
bez_self.py
class Sobaka:
def __init__(self, klichka):
self.klichka = klichka
def layat(): # zapomniano self jako pierwszy parametr
print(„Hau-hau!”)
rex = Sobaka(„Rex”)
rex.layat()
Traceback (most recent call last):
File "bez_self.py", line 9, in
rex.layat()
TypeError: Sobaka.layat() takes 0 positional arguments but 1 was given
Python i tak próbował podstawić rex pierwszą kłótnią podczas dzwonienia rex.layat() — wiązanie metody następuje ZAWSZE, a nie tylko wtedy, gdy się tego spodziewasz. Jeśli w definicji metody nie było parametru, żeby go przyjąć, — Python informuje, że przekazano o jeden argument więcej, niż metoda jest w stanie przyjąć.
Poprawiony kod
s_self.py
class Sobaka:
def __init__(self, klichka):
self.klichka = klichka
def layat(self):
print(f"{self.klichka}: Hau-hau!")
rex = Sobaka(„Rex”)
rex.layat()
Praktyka: self i metody sprzężenia
interaktywny laptop bezpośrednio w przeglądarce – Python 3.14 przez Pyodide, bez instalacji