Hvordan Python-klasser opprettes
Forstå type, standardmetaklassen og hooks for klasseoppretting.
Hvordan Python-klasser opprettes er en gratis leksjon i Python Academy på CoddyKit. Dette er leksjon 1 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.
type() er en metaklasse
Alle klasser i Python er instanser av type. type er selv en klasse – den er metaklassen for alle metaklasser.
# These are equivalent:
class Dog:
sound = "woof"
Dog2 = type("Dog2", (), {"sound": "woof"})
print(type(Dog)) # <class 'type'>
print(type(Dog2)) # <class 'type'>type() med tre argumenter
type(name, bases, namespace) oppretter en ny klasse dynamisk. Dette er nøyaktig det class-setninger gjør under panseret.
Animal = type("Animal", (), {"speak": lambda self: "..."})
Dog = type("Dog", (Animal,), {"speak": lambda self: "woof"})
d = Dog()
print(d.speak()) # woofTrinnene ved opprettelse av en klasse
Når Python ser en class-setning, gjør det følgende: 1) løser metaklassen, 2) klargjør navnerommet, 3) kjører klassekroppen, 4) kaller metaclass(name, bases, namespace).
# class Foo(Base, metaclass=Meta):
# x = 1
#
# Equivalent to:
# namespace = Meta.__prepare__("Foo", (Base,))
# exec(class_body, namespace)
# Foo = Meta("Foo", (Base,), namespace)__prepare__
__prepare__(name, bases, **kw) er en klassemetode på metaklassen som returnerer ordboken for navnerommet som brukes under kjøringen av klassekroppen. Overstyr den for å bruke en OrderedDict eller en egendefinert mapping.
class OrderedMeta(type):
@classmethod
def __prepare__(mcs, name, bases, **kw):
print(f"Preparing namespace for {name}")
return {}
class MyClass(metaclass=OrderedMeta):
x = 1
y = 2__new__ kontra __init__ i type
type.__new__ oppretter klasseobjektet, mens type.__init__ initialiserer det. For metaklasser bør du overstyre __new__ for å tilpasse opprettelsen av klassen.
class Singleton(type):
_instances = {}
def __call__(cls, *args, **kw):
if cls not in cls._instances:
cls._instances[cls] = super().__call__(*args, **kw)
return cls._instances[cls]
class DB(metaclass=Singleton):
pass
print(DB() is DB()) # TrueKlassedekoratorer kontra metaklasser
Klassedekoratorer brukes etter opprettelsen, mens metaklasser styrer selve opprettelsen. For enkel utvidelse bør du foretrekke dekoratorer. Bruk metaklasser når du trenger å påvirke opprettelsesprosessen.
def add_repr(cls):
cls.__repr__ = lambda self: f"{cls.__name__}()"
return cls
@add_repr
class Widget:
pass
print(Widget()) # Widget()__init_subclass__
__init_subclass__ kalles på basisklassen hver gang en underklasse defineres. Det er et lettvektsalternativ til metaklasser for å tilpasse oppførselen til underklasser.
class Plugin:
_registry = []
def __init_subclass__(cls, **kw):
super().__init_subclass__(**kw)
Plugin._registry.append(cls)
class AudioPlugin(Plugin): pass
class VideoPlugin(Plugin): pass
print(Plugin._registry) # [AudioPlugin, VideoPlugin]ABCMeta
ABCMeta er en innebygd metaklasse som gir støtte for abstrakte basisklasser via @abstractmethod.
from abc import ABCMeta, abstractmethod
class Shape(metaclass=ABCMeta):
@abstractmethod
def area(self): ...
class Circle(Shape):
def __init__(self, r): self.r = r
def area(self): return 3.14159 * self.r ** 2
# Shape() # TypeError: Can't instantiate abstract classInspeksjon av en klasses metaklasse
Bruk type(cls) for å finne metaklassen til en klasse, og cls.__mro__ for å se rekkefølgen for metodeoppslag.
class Meta(type): pass
class Foo(metaclass=Meta): pass
print(type(Foo)) # <class '__main__.Meta'>
print(Foo.__mro__) # (Foo, object)Arv av metaklasser
Metaklassen til en klasse arves av underklassene. Hvis to basisklasser har forskjellige metaklasser, må den mest avledede metaklassen brukes, ellers oppstår en konflikt.
class MyMeta(type): pass
class Base(metaclass=MyMeta): pass
class Child(Base): pass # Child's metaclass is also MyMeta
print(type(Child)) # <class '__main__.MyMeta'>Når bør du bruke metaklasser?
Bruk metaklasser til å automatisk registrere underklasser, håndheve klasseinvarianter, oppdage ORM-felt, slik som i Djangos Model, og rute API-rammeverk. I de fleste tilfeller bør du heller bruke __init_subclass__ eller klassedekoratorer.
# Real-world: Django ORM uses ModelBase metaclass
# to collect field definitions into _meta
# You rarely need a custom metaclass;
# __init_subclass__ covers most plugin/registration patternsHurtigsjekk
Hva gjør type("Dog", (Animal,), {"speak": lambda self: "woof"})?
Oppsummering
Alle klasser er instanser av type. Prosessen for opprettelse av en klasse er: løs metaklassen → klargjør navnerommet → kjør kroppen → kall metaklassen. Foretrekk __init_subclass__ for enkle kroker for underklasser, og bruk en full metaklasse bare når du trenger å styre selve opprettelsen av klassen.
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 «Hvordan Python-klasser opprettes» gratis?
Ja – hele teksten i «Hvordan Python-klasser opprettes» 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 «Hvordan Python-klasser opprettes»?
Forstå type, standardmetaklassen og hooks for klasseoppretting. 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 1 av 4.
Hvor lang tid tar leksjonen «Hvordan Python-klasser opprettes»?
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
- Hvordan Python-klasser opprettes
- Skrive egendefinerte metaklasser
- Deskriptorer: __get__, __set__, __delete__
- __slots__ og minneoptimalisering