Rozdział 14 · Tworzenie rzeczywistych obiektów

Atrybuty instancji i klas

Jedna cecha może istnieć w obiekcie, a inna w samej klasie, która jest wspólna dla wszystkich. To nie to samo.

Dwa miejsca, gdzie atrybut może występować

Do tej pory wszystkie atrybuty były tworzone wewnątrz __init__ przez self.имя = ... jest atrybuty instancji, u każdy obiekt ma swój własny. Ale atrybut może być również zadeklarowany bezpośrednio w ciele klasy, bez self — to tak jest atrybut klasy, jeden za wszystkich Obiekty jednocześnie:

atribut_klassa.py
class Sobaka:
    vid = „Dog”          # atrybut KLASY – jeden za wszystkich

    def __init__(self, klichka, vozrast):
        self.klichka = klichka    # Atrybut INSTANCJI jest inny dla każdego
        self.vozrast = vozrast

rex = Sobaka(„Rex”, 3)
sharik = Sobaka(„Ball”, 5)
print(rex.vid, sharik.vid)   # Pies Pies to częsta cecha
Sobakavid (atrybut klasowy)klichkavozrast
Atrybut klasy jest deklarowany w treści klasy; Atrybuty instancji znajdują się w __init__
rex : Sobakavid = 'Dog'klichka = 'Rex'vozrast = 3
rex — vid odczytywane z klasy
sharik : Sobakavid = 'Dog'klichka = 'Ball'vozrast = 5
sharik to ta sama vid, ale nie jest to jego własna kopia
Powszechne nieporozumienie: „atrybuty klasowe są kopiowane do każdego obiektu”
To nieprawda. vid przechowywane RAZ, w samej klasie Sobaka. Kiedy piszesz rex.vid, Python pierwsze spojrzenia vid wśród atrybutów INSTANCJI rex – nie znajduje jej – i dopiero potem patrzy na klasę Sobaka, gdzie znajduje wspólną wartość. Żaden bajt vid nie jest kopiowany do rex.

Jeśli ustawisz atrybut o tej samej nazwie na VIA OBJECT, Python utworzy nowy Atrybut INSTANCE, który teraz „okultyfikuje”

zatenenie.py
rex.vid = „Kundel”    # tworzy vid na rex bez dotykania klasy
print(rex.vid, sharik.vid)   # Kundel – sharik niezmieniony
Praktyka: Atrybuty instancji i klas
interaktywny laptop bezpośrednio w przeglądarce – Python 3.14 przez Pyodide, bez instalacji
Otwórz praktykę →