Bayangkan menulis kod Python yang boleh mengubah suai sendiri atau menjana kod baharu secara dinamik berdasarkan input data masa nyata. Pengaturcaraan meta ialah teknik pengaturcaraan yang berkuasa dan canggih yang membolehkan pembangun menulis kod yang boleh memanipulasi kod lain dan menjana kod baharu semasa masa jalan. Seperti yang kami katakan, metadata ialah data data dan pengaturcaraan meta juga tentang menulis kod yang memanipulasi kod. Oleh itu, artikel ini membincangkan keupayaan pengaturcaraan meta untuk meningkatkan kecekapan dan fleksibiliti kod. Kami akan mempelajari tentang asas, penghias, kelas meta dan pelaksanaan kod dinamiknya dengan menyediakan contoh praktikal bagi setiap konsep. Mari mulakan!
Dalam Python, metaprogramming ialah tentang menulis atur cara komputer yang akan membantu dalam menulis dan memanipulasi atur cara lain. Teknik ini membolehkan program untuk merawat program lain sebagai data. Ia menjana kod, mengubah suai kod sedia ada dan mencipta binaan pengaturcaraan baharu pada masa jalan.
Sebelum beralih kepada aspek teknikal konsep pengaturcaraan meta, mari kita lihat dahulu bagaimana pengaturcaraan generik atau biasa yang berdasarkan langkah prosedur berbeza daripada konsep pengaturcaraan lanjutan.
Metaprogramming memberikan kita pelbagai faedah. Mari terokai mereka untuk memahami kelebihan mereka dalam proses pembangunan.
Sama seperti faedah, pengaturcaraan meta juga datang dengan beberapa kelemahan juga, yang perlu diingat oleh pembangun sebelum menggunakan teknik ini.
Metaclass mentakrifkan tingkah laku dan struktur kelas. Menggunakan metaclass dalam Python, anda boleh menyesuaikan penciptaan dan tingkah laku kelas dengan mudah. Ini mungkin kerana Python mewakili segala-galanya, termasuk kelas, sebagai objek. Selain itu, objek dibuat menggunakan kelas. Oleh itu, "kelas" yang sepatutnya ini bertindak sebagai kelas kanak-kanak kelas lain iaitu metaclass kelas super. Selain itu, semua kelas Python ialah kelas kanak-kanak metaclass.
Nota:
Jenis ialah metaclass lalai dalam python. Ia digunakan untuk mencipta kelas secara dinamik.
Dalam Python, metaclass adalah secara lalai kelas "jenis" iaitu kelas asas yang digunakan untuk mengurus penciptaan dan tingkah laku kelas. Apabila membuat kelas dalam Python, kami secara tidak langsung menggunakan kelas "jenis". Metaclass terdiri daripada dua kaedah utama: __new__ dan __init__. Kaedah __new__ digunakan untuk mencipta objek baharu. Kaedah ini mencipta dan mengembalikan contoh, yang kemudiannya dihantar ke kaedah __init__ untuk permulaan. Ia dipanggil sebelum kaedah __init__ dan memastikan penciptaan kawalan kelas itu sendiri. Kemudian, kaedah __init__ digunakan selepas penciptaan kelas baharu untuk memulakannya dengan atribut dan kaedah furthur. Kaedah ini agak berbeza daripada kaedah pengaturcaraan biasa. Ia membolehkan kami mengubah suai dan menetapkan atribut peringkat kelas selepas penciptaan kelas.
Petua:
Kaedah baharu dan init digunakan untuk mencipta kelas tersuai dan kelakuannya
Mari kita fahami dengan contoh python mudah bagaimana kita boleh mencipta metaclass tersuai untuk menyesuaikan penciptaan kelas dan kelakuannya menggunakan kaedah utama metaclass __new__ dan __init__.
# Define the metaclass class Meta(type): #define the new method for creating the class instance #cls: metaclass whose instance is being created #name: name of the class #base: means the base class #class_dict: represent the dictionary of attributes for a class def __new__(cls, name, bases, attrs): #making the attributes(method) name as upper case uppercase_attrs = {key.upper(): value for key, value in attrs.items() if not key.startswith('__')} new_class = super().__new__(cls, name, bases, uppercase_attrs) print("Class {name} has been created with Meta") return new_class #the class is initialized def __init__(cls, name, bases, dct): super().__init__(name, bases, dct) print(f"Class {name} initilized with Meta") # Using the metaclass in a new class class MyClass(metaclass=Meta): def my_method(self): print(f"Hello!") # Instantiate MyClass and access its custom attribute obj = MyClass() #here the attribute of the class is change into uppercase i.e. the name of method obj.MY_METHOD()
Output
Nota:
Ingat bahawa dalam output, rentetan "Hello" tidak akan ditukar kepada huruf besar, tetapi nama kaedah 'my_method' sebagai 'MY_METHOD' yang akan mencetak rentetan itu. Ini bermakna kami sedang menukar nama kaedah kepada huruf besar.
Penghias ialah ciri utama pemrograman meta Python. Penghias ialah ciri berkuasa yang membolehkan pembangun mengubah suai kod sedia ada tanpa mengubah kod sumber asal. Ia membolehkan anda menambah fungsi baharu dengan memanjangkan fungsi sedia ada. Penghias biasanya dilakukan pada fungsi, dan sintaks mereka menggunakan simbol "@" dengan nama fungsi penghias sebelum kodnya. Dalam Python, penghias bertindak sebagai pembalut di sekeliling fungsi dan kelas lain. Input dan output penghias adalah fungsi itu sendiri, biasanya melaksanakan fungsi sebelum dan selepas fungsi asal.
Penghias menggunakan @decorator_name sebagai sintaks. Manakala nama_penghias ialah nama fungsi yang anda buat sebagai penghias.
# Define the metaclass class Meta(type): #define the new method for creating the class instance #cls: metaclass whose instance is being created #name: name of the class #base: means the base class #class_dict: represent the dictionary of attributes for a class def __new__(cls, name, bases, attrs): #making the attributes(method) name as upper case uppercase_attrs = {key.upper(): value for key, value in attrs.items() if not key.startswith('__')} new_class = super().__new__(cls, name, bases, uppercase_attrs) print("Class {name} has been created with Meta") return new_class #the class is initialized def __init__(cls, name, bases, dct): super().__init__(name, bases, dct) print(f"Class {name} initilized with Meta") # Using the metaclass in a new class class MyClass(metaclass=Meta): def my_method(self): print(f"Hello!") # Instantiate MyClass and access its custom attribute obj = MyClass() #here the attribute of the class is change into uppercase i.e. the name of method obj.MY_METHOD()
Sintaks juga digunakan seperti berikut, yang menunjukkan penghias mengambil fungsi sebagai hujah dan menyimpan hasilnya ke dalam fungsi lain.
@decorator_name def function_name():
Di bawah ialah contoh menggunakan penghias untuk menukar rentetan satu fungsi kepada huruf besar, yang bermaksud menambah fungsi huruf besar pada fungsi:
Function_name = decorator_name(function_name)
Output
Dalam dunia pengaturcaraan meta, pemeriksaan dan refleksi adalah istilah utama. Pemeriksaan dilakukan untuk memeriksa jenis dan sifat objek dalam program dan menyediakan laporan mengenainya semasa runtime. Sebaliknya, pantulan melibatkan pengubahsuaian struktur dan tingkah laku objek pada masa jalan. Kedua-dua ciri bahasa ini menjadikan python sebagai bahasa dinamik yang ditaip dengan kuat. Kita boleh melakukan pemeriksaan dan refleksi dalam metaprogramming menggunakan modul "inspect". Modul ini menyediakan pelbagai fungsi untuk introspeksi, termasuk maklumat tentang jenis dan sifat objek, kod sumber dan timbunan panggilan.
Mari kita fahami bahawa menggunakan modul "periksa" untuk introspeksi dan refleksi digabungkan dengan ciri Python yang lain, kita boleh memeriksa dan mengubah suai objek pada masa berjalan dalam metaprogramming. Kami akan mempelajarinya langkah demi langkah:
# Define the metaclass class Meta(type): #define the new method for creating the class instance #cls: metaclass whose instance is being created #name: name of the class #base: means the base class #class_dict: represent the dictionary of attributes for a class def __new__(cls, name, bases, attrs): #making the attributes(method) name as upper case uppercase_attrs = {key.upper(): value for key, value in attrs.items() if not key.startswith('__')} new_class = super().__new__(cls, name, bases, uppercase_attrs) print("Class {name} has been created with Meta") return new_class #the class is initialized def __init__(cls, name, bases, dct): super().__init__(name, bases, dct) print(f"Class {name} initilized with Meta") # Using the metaclass in a new class class MyClass(metaclass=Meta): def my_method(self): print(f"Hello!") # Instantiate MyClass and access its custom attribute obj = MyClass() #here the attribute of the class is change into uppercase i.e. the name of method obj.MY_METHOD()
Output
@decorator_name def function_name():
Output
Ini adalah cara anda boleh memeriksa dan melakukan pengubahsuaian secara dinamik pada masa jalankan. Menggunakan modul inspect yang digabungkan dengan fungsi terbina dalam Python seperti setattr dan delattr akan membolehkan pembangun menulis fleksibel dan adaptif yang boleh berubah semasa masa jalan.
Petua:
Kedua-dua setattr dan delattr ialah fungsi Python untuk menukar atribut objek secara dinamik. Dalam fungsi ini, setattr digunakan untuk menetapkan dan mengubah atribut, dan delattr digunakan untuk memadam atribut daripada objek.
Seperti yang kita tahu, penyahpepijatan agak lebih sibuk dan memakan masa daripada menulis kod pada kali pertama. Pembangun menyahpepijat kod untuk mengesahkan dan mencari sumber kecacatan untuk mengendalikannya pada peringkat awal. Walau bagaimanapun, ia adalah proses yang sangat heterogen apabila kita tidak dapat mengenal pasti sumbernya. Oleh itu, introspeksi dan refleksi sangat berguna untuk menyahpepijat kod. Ia memeriksa objek secara dinamik pada masa larian dengan memberikan butiran sifat objek, termasuk kelakuannya. Ia menyediakan butiran nilai atribut objek dan nilai yang tidak dijangka dan menerangkan bagaimana keadaan objek berubah dari semasa ke semasa. Untuk menjadikannya lebih jelas, mari gunakan contoh.
Function_name = decorator_name(function_name)
Output
Ringkasnya, kami membincangkan konsep lanjutan Python, iaitu metaprogramming. Seperti yang kita ketahui, metaprogramming ialah teknik yang memperluas dan mengubah suai tingkah laku bahasa Python itu sendiri. Ia boleh membantu anda menulis fungsi yang boleh mengubah suai dan menjana fungsi lain.. Kami boleh melaksanakan pengaturcaraan meta menggunakan pendekatan yang berbeza seperti metaclass membolehkan kami menggunakan kelas jenis lalai dan kemudian penghias, yang bertindak sebagai pembungkus kepada fungsi lain dan beralih ke arah teknik untuk menyahpepijat kod terlebih dahulu. Jadi, di mana sahaja anda bergerak ke arah konsep lanjutan Python, jangan lupa untuk belajar tentang kepentingan metaprogramming juga. Saya harap panduan ini berguna kepada anda. Terima kasih kerana membaca. Selamat mengekod!
Atas ialah kandungan terperinci Konsep Python Lanjutan - Pengaturcaraan Meta. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!