Miten Python-luokat luodaan
Ymmärtäkää type, oletusmetaluokka ja luokkien luontikoukut.
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()) # woofLuokan 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()) # TrueLuokkadekoraattorit 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 classLuokan 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 patternsPikatarkistus
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.
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
- Miten Python-luokat luodaan
- Mukautettujen metaluokkien kirjoittaminen
- Deskriptorit: __get__, __set__, __delete__
- __slots__ ja muistin optimointi