Python Academy · Oppitunti

Miten Python-luokat luodaan

Ymmärtäkää type, oletusmetaluokka ja luokkien luontikoukut.

Oppitunti 1/413 vaihetta

Miten Python-luokat luodaan on ilmainen Python Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/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.

type() on metaluokka

Jokainen Pythonin luokka on type-olion ilmentymä. type on itsekin luokka — se on kaikkien metaluokkien metaluokka.

# These are equivalent:
class Dog:
    sound = "woof"

Dog2 = type("Dog2", (), {"sound": "woof"})
print(type(Dog))    # <class 'type'>
print(type(Dog2))   # <class 'type'>

type():n kolmen argumentin muoto

type(name, bases, namespace) luo uuden luokan dynaamisesti. Luokkien class-lauseet toimivat taustalla juuri näin.

Animal = type("Animal", (), {"speak": lambda self: "..."})
Dog = type("Dog", (Animal,), {"speak": lambda self: "woof"})

d = Dog()
print(d.speak())   # woof

Luokan luonnin vaiheet

Kun Python kohtaa class-lauseen, se: 1) ratkaisee metaluokan, 2) valmistelee nimiavaruuden, 3) suorittaa luokan rungon ja 4) kutsuu metaclass(name, bases, namespace)-kutsua.

# 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) on metaluokan luokkametodi, joka palauttaa luokan rungon suorituksessa käytettävän nimiavaruussanakirjan. Ohita se, jos haluat käyttää OrderedDict-saraketta tai mukautettua kuvausta.

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__ vs __init__ tyypissä type

type.__new__ luo luokkaolion ja type.__init__ alustaa sen. Metaluokissa ohita __new__, jos haluat mukauttaa luokan luontia.

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())  # True

Luokkadekoraattorit vs metaluokat

Luokkadekoraattorit toimivat luokan luonnin jälkeen, kun taas metaluokat hallitsevat itse luontiprosessia. Käytä yksinkertaiseen laajentamiseen mieluiten dekoraattoreita. Käytä metaluokkia, kun sinun on vaikutettava luontiprosessiin.

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__ kutsutaan kantaluokassa aina, kun aliluokka määritellään. Se on kevyt vaihtoehto metaluokille aliluokan toiminnan mukauttamiseen.

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 on sisäänrakennettu metaluokka, joka mahdollistaa abstraktit kantaluokat @abstractmethod-dekoraattorin avulla.

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 class

Luokan metaluokan tarkastelu

Selvitä luokan metaluokka komennolla type(cls) ja tarkastele metodien ratkaisujärjestystä komennolla cls.__mro__.

class Meta(type): pass

class Foo(metaclass=Meta): pass

print(type(Foo))       # <class '__main__.Meta'>
print(Foo.__mro__)     # (Foo, object)

Metaluokan periytyminen

Luokan metaluokka periytyy sen aliluokille. Jos kahdella kantaluokalla on eri metaluokat, on käytettävä kaikkein johdetuinta metaluokkaa, tai syntyy ristiriita.

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'>

Milloin metaluokkia käytetään

Käytä metaluokkia esimerkiksi aliluokkien automaattiseen rekisteröintiin, luokkainvarianttien pakottamiseen, ORM-kenttien tunnistamiseen, kuten Djangon Model-luokassa, ja API-kehysten reititykseen. Useimmissa tapauksissa käytä sen sijaan __init_subclass__-metodia tai luokkadekoraattoreita.

# 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 patterns

Pikatarkistus

Mitä type("Dog", (Animal,), {"speak": lambda self: "woof"}) tekee?

Kertaus

Jokainen luokka on type-olion ilmentymä. Luokan luontiprosessi on seuraava: ratkaise metaluokka → valmistele nimiavaruus → suorita runko → kutsu metaluokkaa. Suosi __init_subclass__-metodia yksinkertaisiin aliluokkien käsittelyihin ja käytä varsinaista metaluokkaa vain, kun sinun on hallittava itse luokan luontia.

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 ”Miten Python-luokat luodaan” ilmainen?

Kyllä – oppitunnin ”Miten Python-luokat luodaan” 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 ”Miten Python-luokat luodaan”?

Ymmärtäkää type, oletusmetaluokka ja luokkien luontikoukut. 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 1/4.

Kuinka kauan ”Miten Python-luokat luodaan”-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. Miten Python-luokat luodaan
  2. Mukautettujen metaluokkien kirjoittaminen
  3. Deskriptorit: __get__, __set__, __delete__
  4. __slots__ ja muistin optimointi
← Takaisin: Python Academy