Python Academy · Lektion

@classmethod och @staticmethod

Definiera klassmetoder och statiska metoder med lämpliga decorators.

Lektion 4 av 414 steg

@classmethod och @staticmethod är en gratis lektion i Python Academy på CoddyKit. Detta är lektion 4 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

@classmethod tar emot klassen som första argument. @staticmethod tar inte emot något särskilt argument. Båda definieras på klassen.

Instansmetod kontra klassmetod kontra statisk metod

Vanliga metoder får self. Klassmetoder får cls. Statiska metoder får inget av dem. Välj utifrån vilka data Ni behöver.
class Demo:
    def instance(self): return 'instance'
    @classmethod
    def class_m(cls): return f'class: {cls.__name__}'
    @staticmethod
    def static_m(): return 'static'
d = Demo()
print(d.instance())
print(Demo.class_m())
print(Demo.static_m())

@classmethod som fabrik

Den vanligaste användningen är alternativa konstruktorer. Date.from_string('2024-01-15') i stället för att tolka strängen i __init__.
class Date:
    def __init__(self, y,m,d): self.y,self.m,self.d=y,m,d
    @classmethod
    def today(cls):
        from datetime import date
        d = date.today()
        return cls(d.year, d.month, d.day)
    def __repr__(self): return f'{self.y}-{self.m}-{self.d}'
print(Date.today())

@classmethod med arv

cls i en klassmetod syftar på den faktiska underklassen, inte basklassen. Därför fungerar fabriksmetoder korrekt med underklasser.
class Animal:
    @classmethod
    def create(cls, name):
        return cls(name)
    def __init__(self, name): self.name = name
class Dog(Animal): pass
d = Dog.create('Rex')
print(type(d).__name__, d.name)

@staticmethod för verktygsfunktioner

Statiska metoder är vanliga funktioner som logiskt grupperats med en klass. De kan inte komma åt klass- eller instansdata.
class MathHelper:
    @staticmethod
    def clamp(value, lo, hi):
        return max(lo, min(hi, value))
print(MathHelper.clamp(15, 0, 10))
print(MathHelper.clamp(-5, 0, 10))

@staticmethod kontra modulfunktion

Om en funktion inte behöver klassen kan den vara en funktion på modulnivå. Använd @staticmethod endast när funktionen logiskt hör till klassen.
class Validator:
    @staticmethod
    def is_email(s): return '@' in s and '.' in s
print(Validator.is_email('user@example.com'))
print(Validator.is_email('not-an-email'))

Anropa från en instans

Ni kan anropa både @classmethod och @staticmethod på instanser, men beteendet för cls och avsaknaden av ett första argument är oförändrat.
class C:
    @classmethod
    def who(cls): return cls.__name__
    @staticmethod
    def pi(): return 3.14
c = C()
print(c.who())
print(c.pi())

Klassmetod för singleton-objekt

Klassmetoder kan framtvinga singleton-mönster genom att kontrollera om en instans redan finns.
class Singleton:
    _instance = None
    @classmethod
    def get(cls):
        if cls._instance is None:
            cls._instance = cls()
        return cls._instance
a = Singleton.get()
b = Singleton.get()
print(a is b)

Åsidosätta klassmetoder

En underklass kan åsidosätta en klassmetod. cls är då underklassen, vilket bevarar polymorfismen.
class Base:
    @classmethod
    def info(cls): return f'{cls.__name__} info'
class Child(Base): pass
print(Base.info())
print(Child.info())

Typkontroll med cls

Inuti en klassmetod är cls den faktiska klassen. Använd cls() för att skapa instanser – hårdkoda inte klassnamnet.
class Shape:
    @classmethod
    def make(cls):
        return cls()  # NOT Shape()
class Square(Shape): pass
print(type(Square.make()).__name__)

Kombinera med @property

Ett cachelagrat värde på klassnivå kan kombineras med @classmethod och ett klassattribut för cachelagring som gäller hela klassen.
class Config:
    _data = None
    @classmethod
    def load(cls):
        if cls._data is None:
            cls._data = {'debug': True}
        return cls._data
print(Config.load())

Snabb kontroll

Vad är cls i en @classmethod?

Sammanfattning

@classmethod får cls: använd den för fabriker, alternativa konstruktorer och singleton-objekt. @staticmethod får inget särskilt argument: använd den för verktygsfunktioner. cls är den faktiska klassen eller underklassen.

Fortsätt

Utmärkt framsteg! Fortsätt för att behärska nästa koncept.
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 ”@classmethod och @staticmethod” gratis?

Ja – hela texten till ”@classmethod och @staticmethod” 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 ”@classmethod och @staticmethod”?

Definiera klassmetoder och statiska metoder med lämpliga decorators. 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 4 av 4.

Hur lång tid tar lektionen ”@classmethod och @staticmethod”?

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. Funktioner som förstaklassobjekt
  2. Skriva egna decorators
  3. Decorators: @property
  4. @classmethod och @staticmethod
← Tillbaka till Python Academy