Cara Class Python Dibuat
Pahami type, metaclass default, dan hook pembuatan class.
Cara Class Python Dibuat adalah pelajaran Python Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Python Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Python Academy mencakup 4 pelajaran total.
type() adalah Metakelas
Setiap kelas di Python adalah instans dari type. type sendiri adalah sebuah kelas—metakelas dari semua metakelas.
# These are equivalent:
class Dog:
sound = "woof"
Dog2 = type("Dog2", (), {"sound": "woof"})
print(type(Dog)) # <class 'type'>
print(type(Dog2)) # <class 'type'>Bentuk Tiga Argumen type()
type(name, bases, namespace) membuat kelas baru secara dinamis. Inilah tepatnya yang dilakukan oleh pernyataan kelas di balik layar.
Animal = type("Animal", (), {"speak": lambda self: "..."})
Dog = type("Dog", (Animal,), {"speak": lambda self: "woof"})
d = Dog()
print(d.speak()) # woofLangkah-Langkah Pembuatan Kelas
Saat Python menemukan pernyataan kelas, Python akan: 1) menyelesaikan metakelas, 2) menyiapkan ruang nama, 3) mengeksekusi isi kelas, 4) memanggil metaclass(name, bases, namespace).
# 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) adalah metode kelas pada metakelas yang mengembalikan kamus ruang nama yang digunakan selama eksekusi isi kelas. Timpa metode ini untuk menggunakan OrderedDict atau pemetaan khusus.
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__ dalam type
type.__new__ membuat objek kelas; type.__init__ menginisialisasinya. Untuk metakelas, timpa __new__ untuk menyesuaikan pembuatan kelas.
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()) # TrueDekorator Kelas vs Metakelas
Dekorator kelas diterapkan setelah pembuatan; metakelas mengendalikan proses pembuatannya sendiri. Untuk penambahan sederhana, lebih baik gunakan dekorator. Gunakan metakelas jika Anda perlu memengaruhi proses pembuatan.
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__ dipanggil pada kelas dasar setiap kali subkelas didefinisikan. Ini merupakan alternatif ringan untuk metakelas dalam menyesuaikan perilaku subkelas.
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 adalah metakelas bawaan yang mendukung kelas dasar abstrak melalui @abstractmethod.
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 classMemeriksa Metakelas Suatu Kelas
Gunakan type(cls) untuk menemukan metakelas suatu kelas dan cls.__mro__ untuk melihat urutan penyelesaian metode.
class Meta(type): pass
class Foo(metaclass=Meta): pass
print(type(Foo)) # <class '__main__.Meta'>
print(Foo.__mro__) # (Foo, object)Pewarisan Metakelas
Metakelas suatu kelas diwarisi oleh subkelasnya. Jika dua kelas dasar memiliki metakelas yang berbeda, metakelas yang paling spesifik harus digunakan, atau akan terjadi konflik.
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'>Kapan Menggunakan Metakelas
Gunakan metakelas untuk: mendaftarkan subkelas secara otomatis, menegakkan invarian kelas, mendeteksi field ORM seperti Model Django, dan melakukan perutean kerangka kerja API. Dalam sebagian besar kasus, gunakan __init_subclass__ atau dekorator kelas sebagai gantinya.
# 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 patternsPemeriksaan Singkat
Apa yang dilakukan oleh type("Dog", (Animal,), {"speak": lambda self: "woof"})?
Ringkasan
Setiap kelas adalah instans dari type. Alur pembuatan kelas: selesaikan metakelas → siapkan ruang nama → eksekusi isi → panggil metakelas. Lebih baik gunakan __init_subclass__ untuk kait subkelas sederhana; gunakan metakelas lengkap hanya jika Anda perlu mengendalikan pembuatan kelas itu sendiri.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Cara Class Python Dibuat” gratis?
Ya — teks lengkap “Cara Class Python Dibuat” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Python Academy, upgrade ke CoddyKit PRO. Kursus Python Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Cara Class Python Dibuat”?
Pahami type, metaclass default, dan hook pembuatan class. Kamu berlatih Python Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Python Academy?
Tidak diperlukan pengalaman sebelumnya. Python Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Cara Class Python Dibuat” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Python Academy ini?
Ya. Setiap pelajaran Python Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Cara Class Python Dibuat
- Menulis Metaclass Kustom
- Descriptor: __get__, __set__, __delete__
- __slots__ dan Optimasi Memori