Python MetaClass元类详解
举个例子,根据实际场景的需要,我们要为多个类添加一个 name 属性和一个 say() 方法。显然有多种方法可以实现,但其中一种方法就是使用 MetaClass 元类。不要从字面上去理解元类的含义,事实上 MetaClass 中的 Meta 这个词根,起源于希腊语词汇 meta,包含“超越”和“改变”的意思。
如果在创建类时,想用 MetaClass 元类动态地修改内部的属性或者方法,则类的创建过程将变得复杂:先创建 MetaClass 元类,然后用元类去创建类,使用该类的实例化对象实现功能。
和前面章节创建的类不同,如果想把一个类设计成 MetaClass 元类,其必须符以下条件:
必须显式继承自 type 类;
- 类中需要定义并实现 __new__() 方法,该方法一定要返回该类的一个实例对象,因为在使用元类创建类时,该 __new__() 方自动被执行,用来修改新建的类。
讲了这么多,读者可能对 MetaClass 元类的功能还是比较懵懂。没关系,我们先尝试定义一个 MetaClass 元类:
#定义一个元类
class FirstMetaClass(type):
# cls代表动态修改的类
# name代表动态修改的类名
# bases代表被动态修改的类的所有父类
# attr代表被动态修改的类的所有属性、方法组成的字典
def __new__(cls, name, bases, attrs):
# 动态为该类添加一个name属性
attrs['name'] = "C语言中文网"
attrs['say'] = lambda self: print("调用 say() 实例方法")
return super().__new__(cls,name,bases,attrs)
此程序中,首先可以断定 FirstMetaClass 是一个类。其次,由于该类继承自 type 类,并且内部实现了 __new__() 方法,因此可以断定 FirstMetaCLass 是一个元类。
可以看到,在这个元类的 __new__() 方法中,手动添加了一个 name 属性和 say() 方法。这意味着,通过 FirstMetaClass 元类创建的类,会额外添加 name 属性和 say() 方法。通过如下代码,可以验证这个结论:有关 __new__() 的具体用法,可阅读《Python __new__()方法》一节。
可以看到,在创建类时,通过在标注父类的同时指定元类(格式为#定义类时,指定元类
class CLanguage(object,metaclass=FirstMetaClass):
pass
clangs = CLanguage()
print(clangs.name)
clangs.say()
metaclass=元类名),则当 Python 解释器在创建这该类时,FirstMetaClass 元类中的 __new__ 方法就会被调用,从而实现动态修改类属性或者类方法的目的。运行上面的程序,输出结果为:
C语言中文网
调用 say() 实例方法
显然,FirstMetaClass 元类的 __new__() 方法动态地为 Clanguage 类添加了 name 属性和 say() 方法,因此,即便该类在定义时是空类,它也依然有 name 属性和 say() 方法。
对于 MetaClass 元类,它多用于创建 API,因此我们几乎不会使用到它。
- 随机文章
- 云河的马尔代夫(探秘云河在马尔代夫的美妙之旅)
- 中国马尔代夫费用(体验中国式马尔代夫,仅需少量费用!)
- 中男足对马尔代夫(中国男足对阵马尔代夫,备战世预赛!)
- 马尔代夫鲍鱼在哪(马尔代夫产鲍鱼,追寻海鲜美食之旅)
- 南京马尔代夫西瓜(南京一件家庭吃西瓜时发现马尔代夫瓜)
- 黄昏马尔代夫图片(绝美黄昏:马尔代夫海滩的壮丽景象)
- 厦门马尔代夫旅游(厦门直飞马尔代夫,浪漫之旅等你来!)
- 拍摄马尔代夫的人(拍摄马尔代夫美景,你必须知道的事项)
- 新航马尔代夫商务(新加坡航空推出马尔代夫商务舱服务!)
- 宝鸡马尔代夫大桥(宝鸡与马尔代夫间的海上大桥正式通车)
- 旺苍马尔代夫地点(后的:旺苍岛:马尔代夫群岛中的秘境)
- 大洋彼岸马尔代夫(马尔代夫:一个在大洋彼岸的度假胜地)
- 热浪 马尔代夫(马尔代夫酷暑难挡,热浪来袭!)
- 南昌出发马尔代夫(南昌起飞,享受马尔代夫曼妙海岛游!)
- 泰州马尔代夫签证(泰州申请前往马尔代夫的签证流程详解)
- 泰国海岛马尔代夫(泰国岛屿竞争马尔代夫,游客纷至沓来)
- 福建马尔代夫住宿(福建游客马尔代夫五星度假屋体验分享)
- 爱偲 马尔代夫(探秘爱偲——马尔代夫私人度假村)
- 长寿江南马尔代夫(长寿之乡江南走出国门,探秘马尔代夫)
- 迷你马尔代夫解密(探秘迷你马尔代夫:全球最小度假胜地)
- 针对疫情马尔代夫(马尔代夫疫情严峻,多项防控措施加强)
- 水彩颜色马尔代夫(用水彩色笔勾勒出马尔代夫的美丽风景)
- 迁安方言马尔代夫(马尔代夫话里的迁安方言,您听过吗?)
- 泰国海岛马尔代夫(泰国岛屿拥有媲美马尔代夫的美丽风光)
- 门口就是马尔代夫(马尔代夫近在咫尺,轻松游览了解风情)
- 邯郸 马尔代夫(邯郸市民推荐的马尔代夫旅游胜地)
- 马尔代夫伊塔餐厅(马尔代夫新开餐厅伊塔,菜品丰富多样)
- 重庆马尔代夫涨水(重庆马尔代夫遇上涨水,游客被迫离开)
- 免签 马尔代夫(马尔代夫开放免签政策,中国游客可免签直接入境)
- 李哲 马尔代夫(李哲负面新闻缠身,接受马尔代夫执业律师考试成功)
