0Pricing
Python Academy · Pelajaran

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

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

Dekorator 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 class

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

Pemeriksaan 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

  1. Cara Class Python Dibuat
  2. Menulis Metaclass Kustom
  3. Descriptor: __get__, __set__, __delete__
  4. __slots__ dan Optimasi Memori
← Kembali ke Python Academy