0Pricing
Python Academy · Lekcja

Atrybuty instancji a atrybuty klasy

Proszę rozróżniać dane należące do poszczególnych obiektów od współdzielonych danych na poziomie klasy.

Atrybuty instancji a atrybuty klasy to bezpłatna lekcja Python Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Python Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Python Academy zawiera 4 lekcji w sumie.

Wprowadzenie

Zrozumienie różnicy między atrybutami instancji a atrybutami klasy pomaga zapobiegać trudnym do wykrycia błędom i umożliwia wydajne współdzielenie stanu.

Atrybut klasy

class Dog: legs = 4 — atrybut legs jest współdzielony przez wszystkie instancje. Można uzyskać do niego dostęp jako Dog.legs lub dog.legs.
class Dog:
    legs = 4
print(Dog.legs)
print(Dog().legs)

Atrybut instancji

self.name = name w __init__ należy do konkretnej instancji. Każdy obiekt Dog ma własny atrybut name.
class Dog:
    def __init__(self, name):
        self.name = name
d1 = Dog('Rex')
d2 = Dog('Buddy')
print(d1.name, d2.name)

Kolejność wyszukiwania atrybutów

Python najpierw sprawdza __dict__ instancji, następnie __dict__ klasy, a potem klasy bazowe. Atrybuty instancji przesłaniają atrybuty klasy.
class C:
    x = 10
c = C()
c.x = 99  # instance shadows class attr
print(c.x)  # 99
print(C.x)  # 10

Pułapka modyfikowalnego atrybutu klasy

class C: items = [] — WSZYSTKIE instancje współdzielą tę samą listę. Dodanie elementu za pośrednictwem jednej instancji wpływa na wszystkie!
class C:
    items = []
C.items.append(1)
print(C().items)  # [1] — shared!

Rozwiązanie problemu modyfikowalnego atrybutu

Inicjalizację należy przenieść do __init__: def __init__(self): self.items = [] Każda instancja otrzyma własną listę.
class C:
    def __init__(self):
        self.items = []
c1 = C(); c2 = C()
c1.items.append(1)
print(c1.items, c2.items)

Inspekcja __dict__

obj.__dict__ to słownik atrybutów instancji. Class.__dict__ to słownik atrybutów klasy.
class Dog:
    legs = 4
    def __init__(self, name): self.name = name
d = Dog('Rex')
print(d.__dict__)
print(Dog.__dict__.keys())

Metody klasowe jako fabryki

@classmethod otrzymuje cls (klasę) zamiast self. Służy jako alternatywny konstruktor.
class Date:
    def __init__(self, y, m, d): self.y,self.m,self.d=y,m,d
    @classmethod
    def from_string(cls, s):
        y,m,d=map(int,s.split('-'))
        return cls(y,m,d)
dt=Date.from_string('2024-01-15')
print(dt.y,dt.m,dt.d)

Metody statyczne

@staticmethod nie otrzymuje self ani cls. Służy do funkcji narzędziowych, które są logicznie powiązane z klasą, ale nie wymagają dostępu do instancji ani klasy.
class MathUtils:
    @staticmethod
    def add(a, b): return a + b
print(MathUtils.add(3, 4))

Śledzenie instancji za pomocą atrybutu klasy

Atrybut klasy używany jako licznik pozwala śledzić, ile instancji zostało utworzonych.
class Widget:
    count = 0
    def __init__(self):
        Widget.count += 1
Widget(); Widget(); Widget()
print(Widget.count)

hasattr() i vars()

hasattr(obj, 'name') sprawdza istnienie atrybutu. vars(obj) jest równoważne obj.__dict__.
class P:
    def __init__(self, x): self.x = x
p = P(5)
print(hasattr(p, 'x'), hasattr(p, 'z'))
print(vars(p))

Szybkie sprawdzenie

Co się dzieje, gdy z poziomu instancji dodasz element do listy będącej modyfikowalnym atrybutem klasy?

Podsumowanie

Atrybuty klasy są współdzielone, a atrybuty instancji należą do poszczególnych obiektów. Wyszukiwanie w instancji przesłania atrybut klasy. Modyfikowalne wartości należy inicjalizować w __init__. @classmethod służy do tworzenia metod fabrykujących.

Kontynuuj

Doskonale! Proszę przejść do następnej lekcji, aby pogłębić swoje umiejętności.

Często zadawane pytania

Czy lekcja „Atrybuty instancji a atrybuty klasy” jest bezpłatna?

Tak — pełny tekst „Atrybuty instancji a atrybuty klasy” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Python Academy, przejdź na CoddyKit PRO. Kurs Python Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Atrybuty instancji a atrybuty klasy”?

Proszę rozróżniać dane należące do poszczególnych obiektów od współdzielonych danych na poziomie klasy. Ćwiczysz Python Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Python Academy?

Nie wymagamy żadnego doświadczenia. Python Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Atrybuty instancji a atrybuty klasy”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Python Academy?

Tak. Każda lekcja Python Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Klasy i metoda __init__
  2. Atrybuty instancji a atrybuty klasy
  3. Metody instancji i self
  4. Metody magiczne: __str__ i __repr__
← Powrót do Python Academy