Bir postga ko'zim tushib qoldi MetaClass haqida. Metaclassdan avval classlar qanday yaratilishi haqida qisqacha bo'lishib o'tmoqchiman.
type() orqali biz istalgan objectni turini tekshiramiz ammo aynan o'sha type() bizga class yaratib berishini bilarmidik?
class Dog:
def __init__(self, name: str) -> None:
self.name = nameSiz odatda classlarni shunday yaratasiz aslida esa orqa fonda boshqacha ishlar bo'ladi.
type(Dog) desangiz u <class 'type'> classini objecti ekanligini ko'rishiz mumkin. Endi keling nimagaligni tushuntiray. Siz tepadagi traditional yo'l bilan class yaratganingizda u yerda mana bu narsalar bo'ladi.class Dog(object, metaclass=type):
def __init__(self, name: str) -> None:
self.name = nameyuqorida ko'rsatilgan
inheritance va metaclass qismlarini siz tashlab ketasiz ammo python uni run timeda shunday olib ketadi by default. Keling bu nima uchun undayligini gaplashsak. Qadamlarga bo'lamiz:1. Python classni tana qismidagi kodlarni string qilib oladi
2. Bo'sh bitta dictionary ochadi.
3. Va ularni type()ga berish orqali sizga typedan object qaytaradi.
Yana bir qoida "Pythonda hamma narsa object".
Keling endi amaliyotga o'tsak. 1-qadam:
class_body = '''
def __init__(self, name: str) -> None:
self.name = name
'''class tanasi uchun class_body o'zgaruvchisini ochib oldik va tanasidagi kodni doc-string ichiga yozib oldik. 2-qadamga o'tamiz.
class_dict = {}Classlardagi ma'lumotlar key value sifatida saqlanadi shuning uchun class_dict ochildi. 3-qadam
endi class_bodydagi elementlarni class_dict ga o'tkazish uchun python standart exec() dan foydalanamiz. Bu shunchaki string shakldagi kodni ishga tushirib beradi.
exec(class_dict globals(), class_body)Endi class_dict ni print qilib ko'rsangiz ajoyib narsa ko'rasiz. Hop ammo keling keyingi qadam klass yaratishga o'tamiz. 3-qadam:
Dog = type('Dog', (object,), class_dict)VOILA! Class tayyor. Endi
Persondan object yaratishingiz mumkin. Keling kodlarni jamlaymiz:class_body = '''
def __init__(self, name: str) -> None:
self.name = name
'''
class_dict = {}
exec(class_body, globals(), class_dict)
Dog = type('Dog', (object,), class_dict)
bobik = Dog('Bobik')
print(bobik)
print(bobik.name)Qisqacha shunday ishlar bo'ladi ammo siz traditional yo'ldan yuravering bu ish sal bosh og'riqrog'u ammo endi bilasiz ular qanday yaratilishini.
@otabekswe