Python Academy · Oppitunti

Instanssiattribuutit ja luokka-attribuutit

Erottakaa oliokohtaiset ja luokkatasolla jaetut tiedot toisistaan.

Oppitunti 2/414 vaihetta

Instanssiattribuutit ja luokka-attribuutit on ilmainen Python Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/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

Instanssi- ja luokka-attribuuttien välisen eron ymmärtäminen ehkäisee vaikeasti havaittavia virheitä ja mahdollistaa tehokkaan jaetun tilan käytön.

Luokka-attribuutti

class Dog: legs = 4 — legs on kaikkien instanssien yhteinen. Siihen pääsee käsiksi muodossa Dog.legs tai dog.legs.
class Dog:
    legs = 4
print(Dog.legs)
print(Dog().legs)

Instanssiattribuutti

self.name = name in __init__ määrittää instanssikohtaisen attribuutin. Jokaisella Dog-instanssilla on oma name-arvonsa.
class Dog:
    def __init__(self, name):
        self.name = name
d1 = Dog('Rex')
d2 = Dog('Buddy')
print(d1.name, d2.name)

Attribuuttien hakujärjestys

Python tarkistaa ensin instanssin __dict__-sanakirjan, sitten luokan __dict__-sanakirjan ja lopuksi kantaluokat. Instanssiattribuutit peittävät luokka-attribuutit.
class C:
    x = 10
c = C()
c.x = 99  # instance shadows class attr
print(c.x)  # 99
print(C.x)  # 10

Muuttuvan luokka-attribuutin ansa

class C: items = [] — KAIKKI instanssit jakavat saman listan. Yhteen instanssiin lisääminen vaikuttaa kaikkiin!
class C:
    items = []
C.items.append(1)
print(C().items)  # [1] — shared!

Muuttuvan attribuutin ongelman ratkaiseminen

Siirtäkää alustus metodiin __init__: def __init__(self): self.items = [] Jokainen instanssi saa oman listansa.
class C:
    def __init__(self):
        self.items = []
c1 = C(); c2 = C()
c1.items.append(1)
print(c1.items, c2.items)

__dict__-tarkastelu

obj.__dict__ on instanssin attribuuttisanakirja. Class.__dict__ on luokan attribuuttisanakirja.
class Dog:
    legs = 4
    def __init__(self, name): self.name = name
d = Dog('Rex')
print(d.__dict__)
print(Dog.__dict__.keys())

Luokkametodit tehdasmetodeina

@classmethod vastaanottaa cls-parametrin (luokan) self-parametrin sijaan. Käyttäkää sitä vaihtoehtoisina konstruktoreina.
class Date:
    def __init__(self, y, m, d): self.y,self.m,self.d=y,m,d
    @classmethod
    def from_string(cls, s):
        y,m,d=map(int,s.split('-'))
        return cls(y,m,d)
dt=Date.from_string('2024-01-15')
print(dt.y,dt.m,dt.d)

Staattiset metodit

@staticmethod-metodilla ei ole self- eikä cls-parametria. Käyttäkää sitä apufunktioihin, jotka on loogista ryhmitellä luokan yhteyteen mutta jotka eivät tarvitse instanssia tai luokkaa.
class MathUtils:
    @staticmethod
    def add(a, b): return a + b
print(MathUtils.add(3, 4))

Instanssien seuraaminen luokka-attribuutin avulla

Luokka-attribuuttina käytettävä laskuri kertoo, kuinka monta instanssia on luotu.
class Widget:
    count = 0
    def __init__(self):
        Widget.count += 1
Widget(); Widget(); Widget()
print(Widget.count)

hasattr() ja vars()

hasattr(obj, 'name') tarkistaa attribuutin olemassaolon. vars(obj) vastaa toimintaperiaatteeltaan lauseketta obj.__dict__.
class P:
    def __init__(self, x): self.x = x
p = P(5)
print(hasattr(p, 'x'), hasattr(p, 'z'))
print(vars(p))

Pikatarkistus

Mitä tapahtuu, kun instanssista lisätään alkio muuttuvaan luokka-attribuuttilistaan?

Kertaus

Luokka-attribuutit ovat yhteisiä, kun taas instanssiattribuutit ovat oliokohtaisia. Instanssin haku peittää luokan attribuutin. Alustakaa muuttuvat arvot metodissa __init__. Käyttäkää @classmethod-metodia tehdasmetodeihin.

Jatka

Hienoa! Jatkakaa seuraavalle oppitunnille syventääksenne taitojanne.
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 ”Instanssiattribuutit ja luokka-attribuutit” ilmainen?

Kyllä – oppitunnin ”Instanssiattribuutit ja luokka-attribuutit” 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 ”Instanssiattribuutit ja luokka-attribuutit”?

Erottakaa oliokohtaiset ja luokkatasolla jaetut tiedot toisistaan. 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 2/4.

Kuinka kauan ”Instanssiattribuutit ja luokka-attribuutit”-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. Luokat ja __init__-metodi
  2. Instanssiattribuutit ja luokka-attribuutit
  3. Instanssimetodit ja self
  4. Taikametodit: __str__ ja __repr__
← Takaisin: Python Academy