Rumah > pembangunan bahagian belakang > Tutorial Python > Konsep Python Lanjutan - Pengaturcaraan Meta

Konsep Python Lanjutan - Pengaturcaraan Meta

Patricia Arquette
Lepaskan: 2024-12-03 02:13:09
asal
994 orang telah melayarinya

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!

Memahami Metaprogramming

1. Metaprogramming Dan Peranannya Dalam Python

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.

2. Metaprogramming Dan Regular Programming

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.

Advanced Python Concepts - Metaprogramming

3. Faedah Dan Risiko Menggunakan Metaprogramming

Metaprogramming memberikan kita pelbagai faedah. Mari terokai mereka untuk memahami kelebihan mereka dalam proses pembangunan.

  1. Metaprogramming mengurangkan masa pembangunan dengan membenarkan atur cara mengubah suai diri mereka pada masa jalan. Teknik ini membolehkan pembangun menulis lebih sedikit kod, menjadikan keseluruhan proses pembangunan lebih cekap berbanding kaedah pembangunan perisian tradisional.
  2. Ia menyediakan penyelesaian kepada pengulangan kod dan mengurangkan masa pengekodan. Seperti yang kita ketahui, pengaturcaraan meta adalah mengenai mengurangkan kod daripada pembangun dan mencipta cara automatik untuk menjana kod pada masa jalankan.
  3. Program menyesuaikan tingkah laku mereka secara dinamik pada masa jalan sebagai tindak balas kepada keadaan tertentu dan data input. Ini menjadikan program perisian lebih berkuasa dan fleksibel.

Sama seperti faedah, pengaturcaraan meta juga datang dengan beberapa kelemahan juga, yang perlu diingat oleh pembangun sebelum menggunakan teknik ini.

  1. Satu risiko pengaturcaraan meta ialah sintaksnya yang rumit.
  2. Memandangkan kod dijana secara dinamik semasa masa jalan, timbul isu pepijat yang tidak kelihatan. Pepijat datang daripada kod yang dijana, yang mencabar untuk dijejaki dan diselesaikan. Kadangkala, ia menjadi sukar untuk mencari sumber dan punca pepijat.
  3. Pelaksanaan atur cara komputer mengambil masa lebih lama daripada biasa kerana Python melaksanakan kod pengaturcaraan meta baharu pada masa jalankan.

Metaclasses: Asas Metaprogramming

1. Metaclass Mekanisme Untuk Mencipta Kelas Secara Dinamik

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.

Advanced Python Concepts - Metaprogramming

Nota:

Jenis ialah metaclass lalai dalam python. Ia digunakan untuk mencipta kelas secara dinamik.

2. Kaedah Metaclass '__new__' Dan '__init__'

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

3. Contoh: Mencipta Metaclass Tersuai Untuk Menyesuaikan Gelagat Penciptaan Kelas

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()
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Output
Advanced Python Concepts - Metaprogramming

 
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: Pengaturcaraan Meta Pada Peringkat Fungsi

1. Penghias Sebagai Fungsi Yang Mengubah Kelakuan Fungsi Lain

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.

2. Sintaks Penghias

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()
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Sintaks juga digunakan seperti berikut, yang menunjukkan penghias mengambil fungsi sebagai hujah dan menyimpan hasilnya ke dalam fungsi lain.

@decorator_name 
def function_name(): 
Salin selepas log masuk
Salin selepas log masuk

3. Ilustrasi mencipta dan menggunakan penghias untuk menambah fungsi pada fungsi

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) 
Salin selepas log masuk
Salin selepas log masuk

Output
Advanced Python Concepts - Metaprogramming

Modul 'periksa': Introspeksi Dan Refleksi

1. Pengenalan Kepada Modul `Periksa` Untuk Introspeksi Dan Refleksi

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.

2. Cara Menggunakan Modul 'inspect' Untuk Memeriksa Dan Mengubah Suai Objek Pada Masa Jalan

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:

1. Periksa Objek Menggunakan Modul "inspect"

# 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()
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Output
Advanced Python Concepts - Metaprogramming
Advanced Python Concepts - Metaprogramming
Advanced Python Concepts - Metaprogramming

2. Mengubah suai Objek Pada Masa Jalan

@decorator_name 
def function_name(): 
Salin selepas log masuk
Salin selepas log masuk

Output
Advanced Python Concepts - Metaprogramming

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. 

3. Kes Penggunaan Praktikal Untuk Introspeksi Dan Refleksi

Nyahpepijat Dan Analisis Kod

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) 
Salin selepas log masuk
Salin selepas log masuk

Output
Advanced Python Concepts - Metaprogramming

Membungkus

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!

 


Rujukan Tambahan

  

Modul Pemeriksaan Python

MetaClasses dalam Python

Penghias

Atas ialah kandungan terperinci Konsep Python Lanjutan - Pengaturcaraan Meta. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan