Di Python, metaclasses adalah ciri yang kuat dan maju yang membolehkan pemaju menyesuaikan penciptaan kelas. Pada asasnya, metaclasses adalah kelas untuk kelas. Sama seperti kelas menentukan tingkah laku objek, metaclasses menentukan tingkah laku kelas. Mereka bertanggungjawab untuk membuat kelas dan boleh mengubah struktur atau tingkah laku mereka sebelum mereka dicipta.
Di Python, metaclass lalai adalah type
. Apabila anda menentukan kelas dalam Python, type
digunakan untuk membuat objek kelas. Anda boleh memikirkan metaclasses sebagai kilang untuk kelas, di mana anda boleh mengubah cara kelas dibina, menambah kaedah atau atribut, dan juga mengubah hierarki warisan.
Untuk menentukan metaclass, anda membuat kelas yang mewarisi dari type
. Berikut adalah contoh mudah untuk menentukan metaclass:
<code class="python">class MyMeta(type): def __new__(cls, name, bases, dct): # Custom logic for class creation print(f"Creating class {name}") return super().__new__(cls, name, bases, dct) class MyClass(metaclass=MyMeta): pass</code>
Dalam contoh ini, MyMeta
adalah metaclass yang mencetak mesej apabila kelas sedang dibuat. MyClass
menggunakan MyMeta
sebagai metaclassnya.
Metaclasses memainkan peranan penting dalam menyesuaikan penciptaan kelas dengan membolehkan anda menentukan bagaimana kelas dibina. Mereka boleh mengubah suai kamus kelas ( dct
), kelas asas ( bases
), dan aspek lain kelas sebelum ia ditandakan. Berikut adalah beberapa cara metaclasses dapat menyesuaikan penciptaan kelas:
bases
yang disampaikan kepada __new__
. Ini boleh digunakan untuk menguatkuasakan corak warisan tertentu.Berikut adalah contoh metaclass yang menambah kaedah ke kelas:
<code class="python">class AddMethodMeta(type): def __new__(cls, name, bases, dct): def new_method(self): return f"Hello from {name}" dct['new_method'] = new_method return super().__new__(cls, name, bases, dct) class MyClass(metaclass=AddMethodMeta): pass obj = MyClass() print(obj.new_method()) # Output: Hello from MyClass</code>
Dalam contoh ini, metaclass AddMethodMeta
menambah new_method
kepada MyClass
.
Corak Singleton memastikan bahawa hanya satu contoh kelas yang dicipta, dan menyediakan titik akses global kepada contoh itu. Metaclasses boleh digunakan untuk melaksanakan corak singleton dengan mengawal proses instansiasi kelas. Berikut adalah cara anda boleh melaksanakan singleton menggunakan metaclass:
<code class="python">class SingletonMeta(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] = super().__call__(*args, **kwargs) return cls._instances[cls] class MyClass(metaclass=SingletonMeta): def __init__(self, value): self.value = value obj1 = MyClass(1) obj2 = MyClass(2) print(obj1.value) # Output: 1 print(obj2.value) # Output: 1 print(obj1 is obj2) # Output: True</code>
Dalam contoh ini, SingletonMeta
memastikan bahawa hanya satu contoh MyClass
yang dibuat. Kaedah __call__
ditindih untuk memeriksa sama ada contoh kelas sudah wujud. Sekiranya ia berlaku, ia mengembalikan contoh yang ada; Jika tidak, ia mewujudkan contoh baru dan menyimpannya.
Metaclasses boleh digunakan dalam pelbagai senario praktikal dalam pengaturcaraan Python. Berikut adalah beberapa contoh:
Berikut adalah contoh menggunakan metaclass untuk pendaftaran kelas automatik:
<code class="python">class PluginRegistryMeta(type): registry = [] def __new__(cls, name, bases, dct): new_class = super().__new__(cls, name, bases, dct) cls.registry.append(new_class) return new_class class Plugin(metaclass=PluginRegistryMeta): pass class PluginA(Plugin): pass class PluginB(Plugin): pass for plugin in PluginRegistryMeta.registry: print(plugin.__name__)</code>
Dalam contoh ini, PluginRegistryMeta
secara automatik mendaftarkan semua kelas yang menggunakannya sebagai metaclass dalam pendaftaran. Ini berguna untuk menguruskan plugin dalam sistem.
Contoh -contoh ini menunjukkan kepelbagaian metaclasses dalam Python dan bagaimana mereka dapat digunakan untuk menyelesaikan pelbagai cabaran pengaturcaraan.
Atas ialah kandungan terperinci Apakah metaclasses dalam python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!