Melaksanakan Gelagat Seperti Kelas Secara Dinamik dalam Modul Menggunakan getattr
Dalam sesetengah senario, mungkin wajar untuk meniru tingkah laku __getattr__ pada kelas tetapi untuk keseluruhan modul. Ini membenarkan penciptaan dinamik kejadian kelas dan penggunaan kaedahnya berdasarkan carian atribut pada modul.
Walau bagaimanapun, percubaan untuk mentakrifkan kaedah __getattr__ secara langsung pada modul menghadapi dua halangan:
Penyelesaian Berasaskan Pembungkus
Satu pendekatan ialah membuat pembalut di sekeliling modul. Sys.modules bertolak ansur dengan jenis objek yang berbeza, jadi kita boleh membungkus modul di dalam kelas dan menetapkannya kepada sys.modules[__name__]. Ini membolehkan tingkah laku dinamik tanpa mengubah suai modul itu sendiri. Teknik ini, walau bagaimanapun, terpakai hanya untuk akses peringkat modul.
Guido van Rossum's Hack
Satu lagi penyelesaian yang dicadangkan oleh Guido van Rossum melibatkan penggantian modul sebenar dalam sys. modul dengan contoh kelas yang ditakrifkan dalam modul. Jentera import melakukan langkah penggantian terakhir ini, membolehkan penggodaman ini. Contoh berikut menunjukkan pendekatan ini:
<code class="python"># module foo.py import sys class Foo: def funct1(self, *args): <code block> def funct2(self, *args): <code block> sys.modules[__name__] = Foo()</code>
Kini, fungsi yang ditakrifkan dalam modul boleh diakses melalui contoh Foo.
Pertimbangan
Apabila menggunakan teknik ini, elemen modul lain mungkin tidak boleh diakses selepas tugasan sys.modules. Tentukan semua fungsi yang diperlukan dalam kelas gantian untuk mengelakkan kehilangan kandungan modul.
__all__ Atribut
Apabila menggunakan daripada import modul *, tentukan __all__ dalam kelas gantian untuk mengendalikan ini jenis penyata import. Abaikan atribut seperti __module__ dan __qualname__ daripada __all__.
Atas ialah kandungan terperinci Bagaimanakah Anda Boleh Meniru Tingkah Laku Seperti Kelas dalam Modul Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!