Apakah itu metaclass
Melalui pengenalan di atas, akhirnya saya samar-samar membawanya ke metaclass. Tetapi kami masih tidak tahu apa itu metaclass.
Apabila kita mencipta kelas, kebanyakannya adalah untuk mencipta objek contoh kelas. Bagaimana pula dengan metaclass? Metaclass digunakan untuk membuat kelas. Cara lain untuk memahaminya ialah: metaclass ialah kelas kelas.
Melalui pengenalan fungsi type() di atas, kita tahu bahawa kelas boleh dicipta melalui fungsi type():
MyClass = type('MyClass', (), {})
Malah, fungsi type() ialah metaclass. type() ialah metaclass yang Python gunakan di belakang tabir untuk mencipta semua kelas.
Jadi sekarang kita juga boleh meneka mengapa fungsi type() adalah type dan bukannya Type?
Ini mungkin untuk konsistensi dengan str, iaitu kelas yang digunakan untuk mencipta objek rentetan, dan int, iaitu kelas yang digunakan untuk mencipta objek integer. jenis ialah kelas yang mencipta objek kelas. Anda boleh melihat ini dengan memeriksa atribut __class__. Segala-galanya dalam Python, perhatikan, di sini saya maksudkan segala-galanya, mereka adalah objek. Ini termasuk integer, rentetan, fungsi dan kelas. Mereka semua adalah objek, dan semuanya dicipta daripada kelas.
# 整形 age = 23 print(age.__class__) # 字符串 name = '两点水' print(name.__class__) # 函数 def fu(): pass print(fu.__class__) # 实例 class eat(object): pass mEat = eat() print(mEat.__class__)
Hasil keluarannya adalah seperti berikut:
<class 'int'> <class 'str'> <class 'function'> <class '__main__.eat'>
Anda boleh lihat semua di atas, iaitu semua objek dicipta melalui kelas, jadi kita mungkin ingin tahu, apakah __class__ __class__? Dengan kata lain, apakah kelas yang mencipta kelas ini?
Kita boleh terus menambah kod berikut berdasarkan kod di atas:
print(age.__class__.__class__) print(name.__class__.__class__) print(fu.__class__.__class__) print(mEat.__class__.__class__)
Hasil keluaran adalah seperti berikut:
<class 'type'> <class 'type'> <class 'type'> <class 'type'>
Perhatikan dengan teliti dan jelaskan lagi Hasil keluaran di atas ialah kita menukar umur integer dan aksara ke dalam nama, Hasil yang dicetak oleh __class__ fungsi fu dan contoh objek mEat. Boleh juga dikatakan hasil cetakan kelas kelas mereka. Didapati bahawa kelas yang dicetak adalah semua jenis.
Seperti yang dinyatakan pada permulaan, metaclass ialah kelas kelas. Dalam erti kata lain, metaclass ialah perkara yang bertanggungjawab untuk mencipta kelas. Anda juga boleh memahami bahawa metaclass bertanggungjawab untuk menjana kelas. Dan jenis ialah metaclass terbina dalam. Iaitu, metaclass Python sendiri.