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()

rex.layat()wywołanie przez kropkęPython szukalayatw klasie Sobakaznaleziskalayat(self)metoda jest zdefiniowana wklasaself = rexzastąpionyautomatycznietreść metodywykonanyz dostępem doself.klichka itd.
Wiązanie metody: obiekt po lewej stronie kropki staje się self w środku metody
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
Co widać na ekranie

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
Otwórz praktykę →