Python Academy · Lektion

Decorators: @property

Använd property för getters, setters och deleters.

Lektion 3 av 414 steg

Decorators: @property är en gratis lektion i Python Academy på CoddyKit. Detta är lektion 3 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

@property omvandlar en metod till ett läsbart attribut. @setter och @deleter kompletterar mönstret för kontrollerad åtkomst.

Varför @property?

I stället för getX()/setX() i Java-stil använder Python @property. Åtkomsten ser ut som ett attribut: obj.value, inte 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 ()

Beräknade egenskaper

Metoder med @property beräknar värdet vid behov. obj.area beräknas varje gång det används – inget lagrat värde behövs.
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 för egenskap

@property_name.setter lägger till en setter. Nu anropar c.radius = 10 setter-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)

Deleter för egenskap

@property_name.deleter hanterar del obj.attr. Använd den för städlogik.
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'))

Skrivskyddad egenskap

Definiera endast getter (ingen setter). Ett försök att tilldela ett värde 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

Setters är den perfekta platsen för att validera data – kontrollera typ, intervall eller format innan värdet lagras.
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)

Cachelagring med property

Kombinera @property med ett cachelagrat värde för att beräkna värdet en gång och sedan memoiseras det.
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 beräknar egenskapen en gång och lagrar den som ett instansattribut – ingen upprepad beräkning behövs.
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__ förhindrar att godtyckliga attribut skapas och sparar minne. Egenskaper lägger till logik. De kompletterar varandra.
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 ska @property användas?

Använd @property när Ni behöver validering, beräknade värden eller vill behålla bakåtkompatibilitet samtidigt som implementationen ändras.
# 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)

Snabb kontroll

Vad händer när Ni försöker tilldela ett värde till en skrivskyddad @property (utan definierad setter)?

Sammanfattning

@property: getter blir attributåtkomst. @name.setter lägger till stöd för skrivning. @name.deleter lägger till stöd för del. @cached_property beräknar värdet en gång. Setters används för validering.

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 ”Decorators: @property” gratis?

Ja – hela texten till ”Decorators: @property” 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 ”Decorators: @property”?

Använd property för getters, setters och deleters. 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 3 av 4.

Hur lång tid tar lektionen ”Decorators: @property”?

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