Gunakan type() untuk membuat kelas secara dinamik

Oleh kerana kelas juga objek, kita boleh membuat kelas semasa program berjalan. Python ialah bahasa yang dinamik. Perbezaan terbesar antara bahasa dinamik dan bahasa statik ialah takrifan fungsi dan kelas tidak ditakrifkan pada masa penyusunan, tetapi dibuat secara dinamik pada masa jalan. Sebelum ini, kita terlebih dahulu memahami fungsi type().

Mula-mula kita mencipta modul hello.py baharu, dan kemudian mentakrifkan kelas Hello,

class Hello(object):
    def hello(self, name='Py'):
        print('Hello,', name)

Kemudian rujuk modul hello dalam modul lain dan keluarkan maklumat yang sepadan. Fungsi type() digunakan untuk melihat jenis jenis dan pembolehubah.

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
from com.twowater.hello import Hello
h = Hello()
h.hello()
print(type(Hello))
print(type(h))

Apakah hasil keluarannya?

Hello, Py
<class 'type'>
<class 'com.twowater.hello.Hello'>

Seperti yang dinyatakan di atas, fungsi type() boleh menyemak jenis jenis atau pembolehubah Hello ialah kelas, jenisnya ialah jenis, dan h ialah contoh, jenisnya ialah com.twowater.hello.Hello . com.twowater sebelumnya ialah nama pakej saya, dan modul hello berada di bawah nama pakej ini.

Fikirkan lebih lanjut di sini Dalam contoh di atas, kami menggunakan fungsi type() untuk menyemak jenis jenis atau pembolehubah. Jenis kelas Hello ditandakan dan hasil cetakan ialah: <kelas 'jenis'> Malah, fungsi type() bukan sahaja boleh mengembalikan jenis objek, tetapi juga mencipta jenis baharu. Takrif kelas dicipta secara dinamik semasa runtime, dan cara untuk mencipta kelas adalah dengan menggunakan fungsi type(). Sebagai contoh, kita boleh mencipta kelas Hello dalam contoh di atas melalui fungsi type() Lihat kod berikut untuk butiran:

# -*- coding: UTF-8 -*-
def printHello(self, name='Py'):
    # 定义一个打印 Hello 的函数
    print('Hello,', name)
# 创建一个 Hello 类
Hello = type('Hello', (object,), dict(hello=printHello))
# 实例化 Hello 类
h = Hello()
# 调用 Hello 类的方法
h.hello()
# 查看 Hello class 的类型
print(type(Hello))
# 查看实例 h 的类型
print(type(h))

Hasil keluarannya adalah seperti berikut:

Hello, Py
<class 'type'>
<class '__main__.Hello'>

Di sini, kita perlu memahami terlebih dahulu cara membuat. objek kelas melalui fungsi jenis():

1 Nama kelas, seperti Hello dalam contoh 2. Ambil perhatian bahawa Python hanya menyokong pewarisan satu kelas induk, tuple harus ditulis dalam satu elemen; dalam contoh Warisi kelas objek, kerana ia adalah tuple elemen tunggal, jadi ia ditulis sebagai (objek,)

3 terikat pada fungsi; dalam contoh, fungsi printHello terikat kepada nama kaedah hello

Corak khusus adalah seperti berikut:

jenis (nama kelas, tuple kelas induk (boleh kosong untuk warisan), kamus yang mengandungi atribut (nama dan nilai))

Baiklah, selepas memahami penggunaan parameter tertentu, mari kita lihat pada output Hasilnya, anda dapat melihat bahawa kelas yang dibuat melalui fungsi type() adalah sama seperti menulis kelas secara langsung, kerana apabila penterjemah Python menemui definisi kelas, ia hanya mengimbas sintaks definisi kelas, dan kemudian memanggil fungsi type() untuk mencipta Out of class.

Tetapi secara amnya, kami menggunakan kaedah kelas ***... untuk mentakrifkan kelas, tetapi fungsi type() juga membenarkan kami mencipta kelas. Dalam erti kata lain, bahasa dinamik itu sendiri menyokong penciptaan kelas yang dinamik semasa masa jalan, yang sangat berbeza daripada bahasa statik Untuk mencipta kelas semasa masa jalan bahasa statik, anda mesti membina rentetan kod sumber dan kemudian memanggil pengkompil. , atau gunakan beberapa alatan untuk menjana perkataan Pelaksanaan kod bahagian pada dasarnya adalah kompilasi dinamik, yang boleh menjadi sangat rumit.

Anda boleh melihat bahawa dalam Python, kelas juga objek, dan anda boleh mencipta kelas secara dinamik. Sebenarnya, ini adalah apa yang Python lakukan di belakang tabir apabila anda menggunakan kelas kata kunci, dan ini dicapai melalui metaclass.

Meneruskan pembelajaran
  • Cadangan kursus
  • Muat turun perisian kursus