Python中的metaclass(元类)是什么

我先来说一说为什么起这个名字:metaclass,这个名字本身的含义是什么。

根据google翻译,meta是元的意思。根本没有提供任何有用的信息。

下面我为mate做两个类比:

1)假如你使用你的手机拍了一张照片,那么这张照片的元数据(mata data)是什么呢?图片=一堆像素数据+元数据。元数据总结了这个图片的属性,大小、格式、拍照地点(GPS坐标)和曝光时间等等信息。

2)html有一个标签叫meta,例如,常用的:<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ />。meta标签的作用是用来描述这个网页的属性的。

metaclass是一个类的类。就像class定义了一个class实例的行为,一个metaclass定义了class的行为。

在理解metaclass之前,你必须掌握Python中的类。Python的类和其它传统语言(java等)有点区别,它引用自Smalltalk语言。

Python类:

Python中的类有点奇怪。

一旦python执行到了关键字class,它会创建一个对象:

上面代码会在内存中创建一个对象:Something。这个对象本身有能力创建对象实例,这也就是为什么说它像一个类。虽然它有类的行为,但是不能使它成为一个类。它终归结底是个对象,因为:

  • 可以为它赋值
  • 可以拷贝它
  • 可以添加属性
  • 可以做为函数参数

例如:

因为类是一个对象,所以你可以动态的创建类,就和对象一样:

metaclass

你定义类是为了创建对象,但是,我们知道Python中类就是对象。注意,metaclass来了,它是class的class,你可以这样看:

在Python中, 任何东西都是对象,没错,任何东西。包括int,string,function和class。这些东西都是对象,也就是说这些对象都是从类中创建出来的。你可以检查__class__属性:

那么__class__的__class__是什么呢,求惊喜:

type是内建的Python元类,所以元类是用来创建类的,可以把它叫做“类工厂”。

当然,你可以创建自己的元类。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注