Python Academy · Oppitunti

@property-dekoraattori

Käyttäkää propertya getter-, setter- ja deleter-menetelmiin.

Oppitunti 3/414 vaihetta

@property-dekoraattori on ilmainen Python Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Python Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Python Academy-kurssilla on yhteensä 4 oppituntia.

Johdanto

@property muuttaa metodin luettavaksi attribuutiksi. @setter ja @deleter täydentävät hallitun käytön mallin.

Miksi @property?

Java-tyylisten getX()- ja setX()-metodien sijaan Python käyttää @property-koristetta. Käyttö näyttää attribuutin käytöltä: obj.value, ei 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 ()

Lasketut ominaisuudet

@property-metodit laskevat arvon tarvittaessa. obj.area lasketaan joka kerta, kun siihen käsiksi — tallennettua arvoa ei tarvita.
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))

Ominaisuuden setter

@property_name.setter lisää setterin. Nyt c.radius = 10 kutsuu setter-metodia.
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)

Ominaisuuden deleter

@property_name.deleter käsittelee ilmauksen del obj.attr. Käyttäkää sitä siivouslogiikkaan.
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'))

Vain luku -ominaisuus

Määrittäkää vain getter ilman setteriä. Sijoitusyritys nostaa AttributeError-poikkeuksen.
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)

Ominaisuuden kelpuutus

Setterit ovat erinomainen paikka tietojen kelpuuttamiseen — tarkistakaa tyyppi, arvoalue tai muoto ennen tallentamista.
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)

Välimuistitus property-koristeella

Yhdistäkää @property välimuistissa säilytettävään arvoon, jotta arvo lasketaan vain kerran ja muistioidaan.
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 laskee ominaisuuden kerran ja tallentaa sen instanssin attribuutiksi — laskentaa ei tarvitse toistaa.
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 vs. __slots__

__slots__ estää mielivaltaisten attribuuttien luonnin ja säästää muistia. Ominaisuudet lisäävät logiikkaa. Ne täydentävät toisiaan.
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)

Milloin @property-koristetta käytetään?

Käyttäkää @property-koristetta, kun tarvitsette kelpuutusta, laskettuja arvoja tai taaksepäin yhteensopivuutta muuttaessanne sisäistä toteutusta.
# 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)

Pikatarkistus

Mitä tapahtuu, kun yritätte sijoittaa arvon vain luku -ominaisuudelle, jolle ei ole määritetty setteriä?

Kertaus

@property: getter muuttuu attribuutin käytöksi. @name.setter lisää kirjoitustuen. @name.deleter lisää del-tuen. @cached_property laskee arvon kerran. Setterit sopivat kelpuutukseen.

Jatkakaa

Edistytte erinomaisesti! Jatkakaa, jotta hallitsette seuraavan käsitteen.
Aloita maksutta

Opi Python tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
76
Oppitunnit
320

Usein kysytyt kysymykset

Onko oppitunti ”@property-dekoraattori” ilmainen?

Kyllä – oppitunnin ”@property-dekoraattori” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Python Academy-kurssin, päivitä CoddyKit PROhon. Python Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”@property-dekoraattori”?

Käyttäkää propertya getter-, setter- ja deleter-menetelmiin. Harjoittelet Python Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Python Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Python Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”@property-dekoraattori”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Python Academy-oppitunnilla?

Kyllä. Jokainen Python Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Funktiot ensiluokkaisina olioina
  2. Mukautettujen dekoraattorien kirjoittaminen
  3. @property-dekoraattori
  4. @classmethod ja @staticmethod
← Takaisin: Python Academy