Python 中的元类(关键词:Python/type/元类)

本文详细介绍了Python中元类的概念,包括元类如何作为type类的子类,以及__new__和__init__方法在类创建过程中的作用。通过具体示例展示了如何在类定义中使用元类,并提供了编写元类的基本框架。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类是 type 类的实例

Python 3 中,用户定义的类是 type 的 1 个实例,type 是 1 个类。

>>> class C:	pass

>>> isinstance(C, type)
True
>>> type(type)
<class 'type'>

元类是 type 类的子类

Python 2 中的新式类和 Python 3 中:
元类是 type 类的 1 个子类。

__new____init__

__new__:用于创建、返回新的 类;

__init__:用于初始化新创建的 类。

class 语句协议

class 语句协议:在 class 语句的末尾,调用 type 对象来创建 类。

class = type(classname, superclasses, attributedict)

type 对象反过来定义了 1 个 __call__ 方法,当调用 type 的时候,自动调用 2 个方法:

type.__new__(typeclass, classname, superclasses, attributedict)
type.__init__(class, classname, superclasses, attributedict)

在类定义中使用元类

Python 3 中:

class Spam(Eggs, metaclass=Meta):	pass

当以这样的方式使用元类的时候,在 class 语句的底部,修改为调用 元类,而不是 type :

class = Meta(classname, superclasses, attributedict)

由于 元类 Meta 是 type 的 1 个子类,所以 type 类的 __call__ 方法把创建、初始化新的类对象的调用委托给元类

Meta.__new__(Meta, classname, superclasses, attributedict)
Meta.__init__(class, classname, superclasses, attributedict)

编写元类

基本元类

class Meta(type):
	def __new__(meta, classname, supers, classdict):
		return type.__new__(meta, classname, supers, classdict)
>>> class MetaOne(type):
	def __new__(meta, classname, supers, classdict):
		print("In MetaOne.new:", classname, supers, classdict, sep='\n...')
		return type.__new__(meta, classname, supers, classdict)
	def __init__(meta, classname, supers, classdict):
		print("In MetaOne.init:", classname, supers, classdict, sep='\n...')
		print('...init class object', list(classdict.keys()))

		
>>> class Spam(Eggs, metaclass=MetaOne):
	data=1
	def meth(self, arg):
		pass

输出:

In MetaOne.new:
...Spam
...(<class '__main__.Eggs'>,)
...{'__qualname__': 'Spam', 'data': 1, '__module__': '__main__', 'meth': <function Spam.meth at 0x0000029C5ED74048>}
In MetaOne.init:
...Spam
...(<class '__main__.Eggs'>,)
...{'__qualname__': 'Spam', 'data': 1, '__module__': '__main__', 'meth': <function Spam.meth at 0x0000029C5ED74048>}
...init class object ['__qualname__', 'data', '__module__', 'meth']

参考文献:

  1. Python 学习手册 - 第 39 章。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值