Python Academy · leksjon

@classmethod og @staticmethod

Definer klassemetoder og statiske metoder med passende decorators.

Leksjon 4 av 414 trinn

@classmethod og @staticmethod er en gratis leksjon i Python Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Python Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Python Academy inneholder totalt 4 leksjoner.

Innledning

@classmethod mottar klassen som første argument. @staticmethod mottar ingen spesielle argumenter. Begge defineres på klassen.

Instans kontra klasse kontra statisk

Vanlige metoder får self. Klassemetoder får cls. Statiske metoder får ingen av delene. Velg ut fra hvilke data De trenger.
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 fabrikk

Den vanligste bruken er alternative konstruktører. Date.from_string('2024-01-15') i stedet for å analysere strengen 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 klassemetode viser til den faktiske underklassen, ikke basisklassen. Dermed fungerer fabrikkmetoder riktig 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 for hjelpefunksjoner

Statiske metoder er vanlige funksjoner som logisk er gruppert med en klasse. De kan ikke få tilgang til klasse- 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 modulfunksjon

Hvis en funksjon ikke trenger klassen, kan den være en funksjon på modulnivå. Bruk @staticmethod bare når funksjonen logisk hører til 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'))

Kalle fra en instans

De kan kalle både @classmethod og @staticmethod på instanser, men oppførselen til cls og fraværet av et første argument er uendret.
class C:
    @classmethod
    def who(cls): return cls.__name__
    @staticmethod
    def pi(): return 3.14
c = C()
print(c.who())
print(c.pi())

Klassemetode for singletoner

Klassemetoder kan håndheve singleton-mønstre ved å kontrollere om en instans allerede finnes.
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)

Overstyre klassemetoder

En underklasse kan overstyre en klassemetode. cls blir da underklassen, slik at polymorfismen opprettholdes.
class Base:
    @classmethod
    def info(cls): return f'{cls.__name__} info'
class Child(Base): pass
print(Base.info())
print(Child.info())

Typesjekking med cls

Inne i en klassemetode er cls den faktiske klassen. Bruk cls() til å opprette instanser – ikke hardkod klassenavnet.
class Shape:
    @classmethod
    def make(cls):
        return cls()  # NOT Shape()
class Square(Shape): pass
print(type(Square.make()).__name__)

Kombinere med @property

En bufret verdi på klassenivå kan kombineres med @classmethod og et klasseattributt for bufring som gjelder hele klassen.
class Config:
    _data = None
    @classmethod
    def load(cls):
        if cls._data is None:
            cls._data = {'debug': True}
        return cls._data
print(Config.load())

Hurtigsjekk

Hva er cls i en @classmethod?

Oppsummering

@classmethod får cls: Bruk den for fabrikker, alternative konstruktører og singletoner. @staticmethod får ingen spesielle argumenter: Bruk den for hjelpefunksjoner. cls er den faktiske klassen eller underklassen.

Fortsett

Utmerket fremgang! Fortsett for å mestre neste konsept.
Gratis å komme i gang

Lær deg Python med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
76
Leksjoner
320

Ofte stilte spørsmål

Er leksjonen «@classmethod og @staticmethod» gratis?

Ja – hele teksten i «@classmethod og @staticmethod» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Python Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Python Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «@classmethod og @staticmethod»?

Definer klassemetoder og statiske metoder med passende decorators. Du øver på Python Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Python Academy?

Ingen tidligere erfaring er nødvendig. Python Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «@classmethod og @staticmethod»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Python Academy-leksjonen?

Ja. Alle Python Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Funksjoner som førsteklasses objekter
  2. Skrive egendefinerte decorators
  3. @property-decoratoren
  4. @classmethod og @staticmethod
← Tilbake til Python Academy