Python Academy · Lektion

Instansattributter kontra klasseattributter

Skeln mellem data pr. objekt og delte data på klasseniveau.

Lektion 2 af 414 trin

Instansattributter kontra klasseattributter er en gratis Python Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Python Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Python Academy-kurset indeholder 4 lektioner i alt.

Introduktion

Hvis du forstår forskellen mellem instansattributter og klasseattributter, forebygger du subtile fejl og kan opnå en effektiv delt tilstand.

Klasseattribut

class Dog: legs = 4 — legs deles af alle instanser. Tilgå den som Dog.legs eller dog.legs.
class Dog:
    legs = 4
print(Dog.legs)
print(Dog().legs)

Instansattribut

self.name = name i __init__ er specifik for hver instans. Hver Dog har sit eget name.
class Dog:
    def __init__(self, name):
        self.name = name
d1 = Dog('Rex')
d2 = Dog('Buddy')
print(d1.name, d2.name)

Rækkefølge ved attributopslag

Python kontrollerer først instansens __dict__, derefter klassens __dict__ og til sidst basisklasserne. Instansattributter skjuler klasseattributter.
class C:
    x = 10
c = C()
c.x = 99  # instance shadows class attr
print(c.x)  # 99
print(C.x)  # 10

Fælden med en foranderlig klasseattribut

class C: items = [] — ALLE instanser deler den samme liste. Hvis du føjer noget til den fra én instans, påvirker det dem alle!
class C:
    items = []
C.items.append(1)
print(C().items)  # [1] — shared!

Løsning på fælden med foranderlige attributter

Flyt initialiseringen til __init__: def __init__(self): self.items = [] Hver instans får sin egen liste.
class C:
    def __init__(self):
        self.items = []
c1 = C(); c2 = C()
c1.items.append(1)
print(c1.items, c2.items)

Inspektion af __dict__

obj.__dict__ er instansens attributordbog. Class.__dict__ er klassens attributordbog.
class Dog:
    legs = 4
    def __init__(self, name): self.name = name
d = Dog('Rex')
print(d.__dict__)
print(Dog.__dict__.keys())

Klassemetoder som fabriksmetoder

@classmethod modtager cls (klassen) i stedet for self. Brug den som alternativ konstruktør.
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)

Statiske metoder

@staticmethod har hverken self eller cls. Brug den til hjælpefunktioner, der logisk hører sammen med en klasse, men ikke har brug for instansen eller klassen.
class MathUtils:
    @staticmethod
    def add(a, b): return a + b
print(MathUtils.add(3, 4))

Sporing af instanser med en klasseattribut

En klasseattribut som tæller kan holde styr på, hvor mange instanser der er oprettet.
class Widget:
    count = 0
    def __init__(self):
        Widget.count += 1
Widget(); Widget(); Widget()
print(Widget.count)

hasattr() og vars()

hasattr(obj, 'name') kontrollerer, om en attribut findes. vars(obj) svarer til obj.__dict__.
class P:
    def __init__(self, x): self.x = x
p = P(5)
print(hasattr(p, 'x'), hasattr(p, 'z'))
print(vars(p))

Hurtig kontrol

Hvad sker der, når du føjer noget til en foranderlig klasseattributliste fra en instans?

Opsummering

Klasseattributter deles, mens instansattributter hører til hvert sit objekt. Instansopslag skjuler klasseattributter. Initialiser foranderlige værdier i __init__. Brug @classmethod til fabriksmetoder.

Fortsæt

Fremragende! Fortsæt til næste lektion for at udbygge dine færdigheder.
Gratis at komme i gang

Lær Python med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
76
Lektioner
320

Ofte stillede spørgsmål

Er lektionen “Instansattributter kontra klasseattributter” gratis?

Ja — hele teksten til “Instansattributter kontra klasseattributter” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Python Academy-kurset, skal du opgradere til CoddyKit PRO. Python Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Instansattributter kontra klasseattributter”?

Skeln mellem data pr. objekt og delte data på klasseniveau. Du øver dig i Python Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Python Academy?

Der kræves ingen tidligere erfaring. Python Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Instansattributter kontra klasseattributter”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Python Academy-lektion?

Ja. Alle Python Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Klasser og __init__-metoden
  2. Instansattributter kontra klasseattributter
  3. Instansmetoder og self
  4. Magiske metoder: __str__ og __repr__
← Tilbage til Python Academy