Invokasi Dinamik Kaedah Kelas pada Modul
Apabila mengakses atribut modul, tingkah laku biasa melibatkan mendapatkan semula atribut yang ditakrifkan secara statik. Walau bagaimanapun, bagaimana jika kita menginginkan mekanisme untuk mencipta kejadian kelas secara dinamik dalam modul dan menggunakan kaedah kelas itu apabila atribut diakses?
Untuk mencapai ini, kita mesti mengatasi dua halangan:
- xxx adalah khusus kelas dan tidak boleh diakses pada modul.
Modul tidak boleh diberikan atribut dalam pelaksanaan standard Python.-
Instance Tunggal Wrapper
Untuk memintas kedua-dua had, kami menggunakan pembalut yang secara dinamik mencipta tika baharu kelas yang diingini setiap kali carian atribut gagal:
<code class="python">def __getattr__(mod, name):
return getattr(A(), name)</code>
Salin selepas log masuk
Dalam pelaksanaan ini, 'A' ialah kelas dalam modul yang kaedahnya ingin kami akses. Penyelesaian ini, walau bagaimanapun, boleh membawa kepada perbezaan halus dalam tingkah laku kerana penciptaan berbilang kejadian dan memintas global.
Penggantian dengan Contoh Kelas
Sebagai alternatif, kami boleh menggunakan mesin import Python untuk gantikan modul itu sendiri dengan contoh kelas yang diingini.
<code class="python">class Foo:
def funct1(self, args):
<code>
sys.modules[__name__] = Foo()</code>
Salin selepas log masuk
Teknik ini dengan berkesan membolehkan kami menggunakan
getattr dan kaedah meta lain pada modul.
Nota
Apabila menggunakan pendekatan pembalut, pastikan semua elemen yang diperlukan hadir dalam kelas gantian, kerana mana-mana global yang ditakrifkan dalam modul akan hilang.- Untuk 'dari import modul *' untuk berfungsi dengan betul, pastikan
- semua ditakrifkan dalam kelas gantian.
Dengan memahami teknik ini, kami boleh melanjutkan kefungsian modul untuk memasukkan penyeruan kaedah dinamik, menambah fleksibiliti kepada kod kami.
Atas ialah kandungan terperinci Bagaimanakah kita boleh menggunakan kaedah kelas secara dinamik pada modul dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!