Python Academy · Lektion

Instansattribut kontra klassattribut

Skilj mellan data per objekt och data som delas på klassnivå.

Lektion 2 av 414 steg

Instansattribut kontra klassattribut är en gratis lektion i Python Academy på CoddyKit. Detta är lektion 2 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Python Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Python Academy innehåller totalt 4 lektioner.

Introduktion

Att förstå skillnaden mellan instansattribut och klassattribut förebygger subtila buggar och möjliggör effektivt delat tillstånd.

Klassattribut

class Dog: legs = 4 — legs delas av alla instanser. Åtkomst via Dog.legs eller dog.legs.
class Dog:
    legs = 4
print(Dog.legs)
print(Dog().legs)

Instansattribut

self.name = name i __init__ gäller för en specifik instans. Varje Dog har sitt eget name.
class Dog:
    def __init__(self, name):
        self.name = name
d1 = Dog('Rex')
d2 = Dog('Buddy')
print(d1.name, d2.name)

Ordning för attributuppslagning

Python kontrollerar först instansens __dict__, därefter klassens __dict__ och sedan basklasserna. Instansattribut överskuggar klassattribut.
class C:
    x = 10
c = C()
c.x = 99  # instance shadows class attr
print(c.x)  # 99
print(C.x)  # 10

Fällan med föränderliga klassattribut

class C: items = [] — ALLA instanser delar samma lista. Om något läggs till via en instans påverkas alla!
class C:
    items = []
C.items.append(1)
print(C().items)  # [1] — shared!

Lös fällan med föränderliga attribut

Flytta initieringen till __init__: def __init__(self): self.items = [] Varje instans får sin egen lista.
class C:
    def __init__(self):
        self.items = []
c1 = C(); c2 = C()
c1.items.append(1)
print(c1.items, c2.items)

Inspektera __dict__

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

Klassmetoder som fabriker

@classmethod tar emot cls (klassen) i stället för self. Använd den som en alternativ 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)

Statiska metoder

@staticmethod har varken self eller cls. Använd den för hjälpfunktioner som logiskt hör ihop med en klass men inte behöver instansen eller klassen.
class MathUtils:
    @staticmethod
    def add(a, b): return a + b
print(MathUtils.add(3, 4))

Spåra instanser med klassattribut

Ett klassattribut som räknare kan spåra hur många instanser som har skapats.
class Widget:
    count = 0
    def __init__(self):
        Widget.count += 1
Widget(); Widget(); Widget()
print(Widget.count)

hasattr() och vars()

hasattr(obj, 'name') kontrollerar om attributet finns. vars(obj) motsvarar obj.__dict__.
class P:
    def __init__(self, x): self.x = x
p = P(5)
print(hasattr(p, 'x'), hasattr(p, 'z'))
print(vars(p))

Snabbkontroll

Vad händer när ni lägger till något i en föränderlig lista som är ett klassattribut från en instans?

Sammanfattning

Klassattribut delas, medan instansattribut hör till ett specifikt objekt. Instansuppslagning överskuggar klassen. Initiera föränderliga objekt i __init__. Använd @classmethod för fabrikmetoder.

Fortsätt

Utmärkt! Fortsätt till nästa lektion för att fördjupa era kunskaper.
Gratis att börja

Lär dig Python med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
76
Lektioner
320

Vanliga frågor

Är lektionen ”Instansattribut kontra klassattribut” gratis?

Ja – hela texten till ”Instansattribut kontra klassattribut” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Python Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Python Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Instansattribut kontra klassattribut”?

Skilj mellan data per objekt och data som delas på klassnivå. Ni övar på Python Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Python Academy?

Du behöver inga förkunskaper. Utbildningen i Python Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.

Hur lång tid tar lektionen ”Instansattribut kontra klassattribut”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Python Academy-lektionen?

Ja. Varje Python Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Klasser och metoden __init__
  2. Instansattribut kontra klassattribut
  3. Instansmetoder och self
  4. Magiska metoder: __str__ och __repr__
← Tillbaka till Python Academy