日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

看完必会元编程

發(fā)布時(shí)間:2023/12/20 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 看完必会元编程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

元編程

元編程的概念來自LISP和smalltalk。

用來生成代碼的程序稱為元程序metaprogram,編寫這種程序就稱為元編程metaprogramming。
python主要通過反射來實(shí)現(xiàn)元編程。

Python中
所有非object類都繼承自O(shè)bject類
所有類的類型包括type類都是type
type類繼承自object類,object類的類型也是type類

type類

type構(gòu)建類

class type(object):def __init__(cls, what, bases=None, dict=None): # known special case of type.__init__"""type(object_or_name, bases, dict)type(object) -> the object's type type(name, bases, dict) -> a new type# (copied from class doc)"""pass

構(gòu)建

def __init__(self):self.x = 1000def show(self):return self.__dict__XClass = type('myclass', (object,), {'a':100, 'b': 'string', 'show':show, '__init__':__init__}) # 字典是類屬性 print(XClass) print(XClass) print(XClass.__name__) print(XClass.__dict__) print(XClass.mro())XClass().show()

可以借助type構(gòu)造任何類,用代碼生成代碼,這就是元編程。

構(gòu)建元類

一個(gè)類可以繼承自type類

class ModelMeta(type):def __new__(cls, *args):print(cls)print(*args)return super().__new__(cls, *args)

繼承自type,ModelMeta就是元類,它可以創(chuàng)建出其他類。

class ModelMeta(type): # 繼承自typedef __new__(cls, name, bases, attrs: dict):print(cls)print(name)print(bases)print(attrs)print("--------")return super().__new__(cls, name, bases, attrs)# 第一種 使用metaclass關(guān)鍵字參數(shù)指定元類 class A(metaclass=ModelMeta):id = 100def __init__(self):self.x = 2000# 第二種 B繼承自A后,依然是從ModelMeta的類型 class B(A): # 繼承pass# 第三種 元類就可以使用下面的方式創(chuàng)建新的類 C = ModelMeta('Class', (), {'y': 200})print(type(A)) print(type(B)) print(type(C))

從運(yùn)行結(jié)果還可以分析出__new__(cls, *args) 的參數(shù)結(jié)構(gòu)
中間是一個(gè)元組 ('A', (), {'__init__': <function A.__init__ at 0x0000000000B6E598>, '__module__':'__main__', '__qualname__': 'A', 'id': 100})
對應(yīng) (name, bases, dict)

從運(yùn)行結(jié)果可以看出,只要元類是ModelMeta,創(chuàng)建類對象時(shí),就會(huì)調(diào)用ModelMeta的__new__方法

元類的應(yīng)用

class Field:def __init__(self, fieldname=None, pk=False, nullable=False):self.fieldname = fieldnameself.pk = pkself.nullable = nullabledef __repr__(self):return "<Field {}>".format(self.fieldname)class ModelMeta(type): # 繼承自typedef __new__(cls, name, bases, attrs: dict):print(cls)print(name)print(bases)print(attrs, '-------------')# 使用元類動(dòng)態(tài)注入表名tblname = '__tablename__'if tblname not in attrs.keys():attrs[tblname] = nameprimarykeys = []for k, v in attrs.items():if isinstance(v, Field):print(k)print(v)print(v.fieldname)if v.fieldname is None:v.fieldname = k # 沒有名字則使用屬性名if v.pk:primarykeys.append(v)attrs['__primarykeys__'] = primarykeysreturn super().__new__(cls, name, bases, attrs)class ModelBase(metaclass=ModelMeta):passclass Student(ModelBase):id = Field(pk=True, nullable=False)name = Field('username', nullable=False)age = Field()print('----------------') print(Student.__dict__)

元編程的總結(jié)

元類是制造類的工廠,是生成類的類。
構(gòu)造好元類,就可以在類定義時(shí),使用關(guān)鍵字參數(shù)metaclass指定元類,可以使用最原始的metatype(name,
bases, dict)的方式構(gòu)造一個(gè)類。
元類的 __new__()方法中,可以獲取元類信息、當(dāng)前類、基類、類屬性字典。

元編程一般用于框架開發(fā)中。

總結(jié)

以上是生活随笔為你收集整理的看完必会元编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。