Pemrograman Meta Master Python:Teknik Metaclass Tingkat Lanjut
Dengan Python, Pemrograman Meta mengacu pada praktik penulisan kode yang memiliki pengetahuan sendiri dan dapat dimanipulasi. Metaclass adalah alat yang ampuh untuk metaprogramming dengan Python, memungkinkan Anda menyesuaikan cara kelas dibuat dan berperilaku. Dengan menggunakan metakelas, Anda dapat membuat program yang lebih fleksibel dan efisien melalui pembuatan dan refleksi kode dinamis.
Pemrograman meta dengan Python melibatkan teknik seperti dekorator dan metaclass. Dalam tutorial ini, Anda akan mempelajari tentang pemrograman meta dengan kelas meta dengan menjelajahi pembuatan dan refleksi kode dinamis.
Mendefinisikan Metaclass
Pemrograman meta dengan metakelas di Python menawarkan fitur-fitur canggih yang mengaktifkan kemampuan tingkat lanjut pada program Anda. Salah satu fitur tersebut adalah metode __prepare__(), yang memungkinkan penyesuaian namespace tempat badan kelas akan dieksekusi.
Metode ini dipanggil sebelum kode isi kelas dijalankan, menyediakan cara untuk menginisialisasi namespace kelas dengan atribut atau metode tambahan. Metode __prepare__() harus diimplementasikan sebagai metode kelas.
Contoh
Berikut adalah contoh pembuatan metaclass dengan fitur-fitur canggih menggunakan metode __prepare__().
class MyMetaClass(type):
@classmethod
def __prepare__(cls, name, bases, **kwargs):
print(f'Preparing namespace for {name}')
# Customize the namespace preparation here
custom_namespace = super().__prepare__(name, bases, **kwargs)
custom_namespace['CONSTANT_VALUE'] = 100
return custom_namespace
# Define a class using the custom metaclass
class MyClass(metaclass=MyMetaClass):
def __init__(self, value):
self.value = value
def display(self):
print(f"Value: {self.value}, Constant: {self.__class__.CONSTANT_VALUE}")
# Instantiate the class
obj = MyClass(42)
obj.display()
Keluaran
Saat menjalankan kode di atas, Anda akan mendapatkan hasil berikut −
Preparing namespace for MyClass
Value: 42, Constant: 100
Pembuatan Kode Dinamis dengan Metaclass
Pemrograman meta dengan metaclass memungkinkan pembuatan atau modifikasi kode selama runtime.
Contoh
Contoh ini menunjukkan bagaimana metakelas dalam metaprogramming Python dapat digunakan untuk pembuatan kode dinamis.
class MyMeta(type):
def __new__(cls, name, bases, attrs):
print(f"Defining class: {name}")
# Dynamic attribute to the class
attrs['dynamic_attribute'] = 'Added dynamically'
# Dynamic method to the class
def dynamic_method(self):
return f"This is a dynamically added method for {name}"
attrs['dynamic_method'] = dynamic_method
return super().__new__(cls, name, bases, attrs)
# Define a class using the metaclass
class MyClass(metaclass=MyMeta):
pass
obj = MyClass()
print(obj.dynamic_attribute)
print(obj.dynamic_method())
Keluaran
Saat mengeksekusi kode di atas, Anda akan mendapatkan hasil berikut −
Defining class: MyClass
Added dynamically
This is a dynamically added method for MyClass
Refleksi dan Metaprogramming
Pemrograman meta dengan metakelas sering kali melibatkan refleksi, memungkinkan introspeksi dan modifikasi atribut dan metode kelas pada waktu proses.
Contoh
Dalam contoh ini, metakelas MyMeta memeriksa dan mencetak atribut MyClass selama pembuatannya, menunjukkan bagaimana metakelas dapat melakukan introspeksi dan memodifikasi definisi kelas secara dinamis.
class MyMeta(type):
def __new__(cls, name, bases, dct):
# Inspect class attributes and print them
print(f"Class attributes for {name}: {dct}")
return super().__new__(cls, name, bases, dct)
class MyClass(metaclass=MyMeta):
data = "example"
Keluaran
Saat mengeksekusi kode di atas, Anda akan mendapatkan hasil berikut −
Class attributes for MyClass: {'__module__': '__main__', '__qualname__': 'MyClass', 'data': 'example'}