Python Academy · leksjon

@property-decoratoren

Bruk property for getters, setters og deleters.

Leksjon 3 av 414 trinn

@property-decoratoren er en gratis leksjon i Python Academy på CoddyKit. Dette er leksjon 3 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

@property gjør en metode om til et lesbart attributt. @setter og @deleter fullfører mønsteret for kontrollert tilgang.

Hvorfor @property?

I stedet for getX()/setX() i Java-stil bruker Python @property. Tilgangen ser ut som et attributt: obj.value, ikke obj.get_value().
class Circle:
    def __init__(self, r): self._r = r
    @property
    def radius(self): return self._r
c = Circle(5)
print(c.radius)  # no ()

Beregnede egenskaper

@property-metoder beregner verdier fortløpende. obj.area beregnes hver gang det aksesseres – det trengs ingen lagret verdi.
import math
class Circle:
    def __init__(self, r): self._r = r
    @property
    def area(self): return math.pi * self._r**2
c = Circle(5)
print(round(c.area, 2))

Setter for egenskaper

@property_name.setter legger til en setter. Nå kaller c.radius = 10 set-metoden.
class Circle:
    def __init__(self, r): self._r = r
    @property
    def radius(self): return self._r
    @radius.setter
    def radius(self, val):
        if val <= 0: raise ValueError('radius must be positive')
        self._r = val
c = Circle(5)
c.radius = 10
print(c.radius)

Sletter for egenskaper

@property_name.deleter håndterer del obj.attr. Bruk den til oppryddingslogikk.
class User:
    def __init__(self, name): self._name = name
    @property
    def name(self): return self._name
    @name.deleter
    def name(self): del self._name
u = User('Alice')
del u.name
print(hasattr(u, '_name'))

Skrivebeskyttet egenskap

Definer bare getter-metoden (ingen setter). Forsøk på tilordning utløser AttributeError.
class Const:
    def __init__(self, v): self._v = v
    @property
    def value(self): return self._v
c = Const(42)
print(c.value)
try: c.value = 99
except AttributeError as e: print(e)

Egenskap med validering

Settere er det ideelle stedet for å validere data – kontroller type, område eller format før lagring.
class BoundedInt:
    def __init__(self, lo, hi): self.lo,self.hi=lo,hi; self._v=lo
    @property
    def value(self): return self._v
    @value.setter
    def value(self, v):
        if not self.lo <= v <= self.hi:
            raise ValueError(f'{v} out of [{self.lo},{self.hi}]')
        self._v = v
b = BoundedInt(0, 10)
b.value = 5
print(b.value)

Bufring med property

Kombiner @property med en bufret verdi for å beregne én gang og lagre resultatet.
class Expensive:
    _cache = None
    @property
    def result(self):
        if self._cache is None:
            self._cache = sum(range(1000))
        return self._cache
e = Expensive()
print(e.result)
print(e.result)

cached_property (Python 3.8+)

@functools.cached_property beregner egenskapen én gang og lagrer den som et instansattributt – ingen gjentatt beregning.
from functools import cached_property
import math
class Circle:
    def __init__(self, r): self.r = r
    @cached_property
    def area(self): return math.pi * self.r**2
c = Circle(5)
print(round(c.area, 2))

property kontra __slots__

__slots__ hindrer oppretting av vilkårlige attributter og sparer minne. Egenskaper legger til logikk. De utfyller hverandre.
class Point:
    __slots__ = ('_x', '_y')
    def __init__(self, x, y): self._x,self._y=x,y
    @property
    def x(self): return self._x
p = Point(1, 2)
print(p.x)

Når bør De bruke @property?

Bruk @property når De trenger validering, beregnede verdier eller vil opprettholde bakoverkompatibilitet mens implementasjonen endres.
# Before: class Person:
#     def __init__(self, age): self.age = age
# After: add validation without changing caller code
class Person:
    def __init__(self, age): self.age = age
    @property
    def age(self): return self._age
    @age.setter
    def age(self, v):
        if v < 0: raise ValueError('negative age')
        self._age = v
p = Person(30)
print(p.age)

Hurtigsjekk

Hva skjer når De prøver å tilordne en skrivebeskyttet @property (uten definert setter)?

Oppsummering

@property: getter blir til attributtilgang. @name.setter legger til støtte for skriving. @name.deleter legger til støtte for del. @cached_property beregner én gang. Settere brukes til validering.

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 «@property-decoratoren» gratis?

Ja – hele teksten i «@property-decoratoren» 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 «@property-decoratoren»?

Bruk property for getters, setters og deleters. 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 3 av 4.

Hvor lang tid tar leksjonen «@property-decoratoren»?

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