元类
在面向对象程序设计中，元类（）是一种实例是类的类。普通的类定义的是特定对象的行为，元类定义的则是特定的类及其实例的行为。不是所有面向对象编程语言都支持元类。在它能做的事情之中，元类可以覆写任何给定方面类行为的程度是不同的。元类可以通过使类成为头等对象来实现，在这种情况下元类简单的就是构造类的一个对象。每个语言都有它自己的元对象协议，给出对象、类和元类如何交互的规则。
在Smalltalk中，所有东西都是对象。此外，Smalltalk是基于类的系统，这意味着所有对象都有一个类，它定义这个对象的结构（比如说这个类拥有实例变量），和这个对象所理解的消息。二者在一起，蕴含了在Smalltalk中，类是一个对象，因此类也需要是它的元类的实例。平常的Smalltalk不将元类展示为单独的类，转而允许一起同时编辑类和它的元类。
类方法实际上属于元类，就像实例方法实际上属于类一样。要允许类拥有它们自己的类方法和它们自己的，它叫作类实例变量（不应混淆于和在类中定义的实例变量），Smalltalk-80为每个类codice_1介入了它们自己的元类codice_2。这意味着每个元类在效果上都是单例类。就像连体双胞胎，类和元类是共生的。元类有一个实例变量codice_3，它指向它结合的类。
作为一个例子，轿车对象codice_4是类codice_5的实例。依次，类codice_5也是个对象，并且是叫作codice_7的codice_5的元类的实例。注意在元类名字中有空白，元类的名字是Smalltalk表达式，在求值它的时候，结果为元类对象。因此求值codice_7，结果是名字为codice_7的codice_5的元类对象（这可以通过求值codice_12来确认，它返回codice_5的元类的名字。）
在早期的Smalltalk中，只有叫作codice_14的一个元类。这蕴含着所有类拥有的类方法都是相同的，特别是建立一个对象的方法，也就是codice_15。在Smalltalk-80中，因为没有让元类相互之间表现得不同的要求，所有元类都是叫作codice_16的一个类的实例。codice_16的元类叫作codice_18，它再次是codice_16类的实例。
在Smalltalk-80中，终端对象是一个整数、一个组件、或一台车等，而类是像codice_20、或codice_21或codice_5等这样的东西，除了codice_23之外，所有的类都有一个超类。元类所继承的元类，就是元类对应的类所继承的类的元类。
在一个消息被发送到对象的时候，方法的查找开始于它的类。如果没有找到则在上行超类链，停止于codice_23而不管找到与否。在一个消息被发送到一个类的时候，类方法查找开始于它的元类，并上行超类链至codice_25。直至codice_25，元类的超类层级并行于类的超类层级。在Smalltalk-80中，codice_25是codice_14的子类：
Object class superclass == Class.
类方法的查找在元类链之后仍可继续下去，所有元类都是codice_14的在继承层级中的子类，它是所有元类的抽象超类，它描述这些类的一般性质，继而最终可上溯至codice_23。
四个类提供描述新类的设施，下面是它们的继承层级（来自codice_23），和它们提供的主要设施：
下面是方法查找次序的辨析：
下面是两个示意图，二者都是纵向连线表示实例联系，而横向连线表示继承联系。实例联系以Metaclass（元类类）及其元类为顶端，而继承联系以Object（对象类）及其元类为中心，其中Object class（对象元类）继承Class（类类）是串接元类继承链与类继承链的关键环节。前者图示采用Smalltalk-80蓝皮书的样式（但旋转了180°），将Metaclass（元类类）及其元类放置在最上方的独立两行，使得实例联系尽量成为树状向上汇聚；后者图示将Metaclass（元类类）及其元类放置在最左边，使得继承联系尽量都在同一行之上。 下列例子展示，从Smalltalk-80派生的Squeak和Pharo的样例代码的结构，它们在codice_23上增设了codice_46，用来确立Squeak中任何对象都要求的极小化行为。在示意图中，纵向的绿色连接，展示继承联系的“子→父”关系（隐含的自下而上），横向的蓝色连接展示实例联系的“成员→容器”关系，从codice_47出的发蓝色连接，指向codice_47的最小实际容器，它是在调用在codice_47上的方法时查找方法的继承链起点：
这个结构由两个部份构成，用户部份有四个显式的对象和类及其两个隐式的元类：终端对象codice_50和codice_51，它们连接到的类codice_52和codice_53，它们两个连接到的右侧灰色节点表示的隐式的元类，其他的对象都是内建部份。
在Python中，内建的类codice_54是元类。 类的定义，不包括它的实例对象的细节，如它们的字节为单位的大小，它们在内存中的二进制格局，它们是如何分配的，每次建立实例时自动调用的codice_55方法，诸如此类。不只是在建立新实例对象的时候，而且在每次访问实例对象的任何特性的时候，这些细节都起到作用。在没有元类的语言中，这些细节是在语言规定中定义的，并且不能被覆写（override）。
在Python中，元类codice_54控制着类行为的这些细节，默认定义出的类自身都是codice_54的实例。新的元类可以很容易定义为codice_54的子类从而覆写它，通过向类定义提供“关键字参数”codice_59就可以使用这个新的元类。 »> type(b)
»> print(type(B), B.__bases__, [*B.__dict__])  (,) ['__module__', '__doc__'] »> print(type(A), A.__bases__, [*A.__dict__])  (,) ['__module__', '__dict__', '__weakref__', '__doc__'] »> print(type(M), M.__bases__, [*M.__dict__])  (,) ['__module__', '__doc__'] »> print(type(c), c.__bases__)  (,) »> print(type(r), r.__bases__)  () »> sorted({*r.__dict__} & {*c.__dict__}) ['__delattr__', '__dir__', '__doc__', '__getattribute__', '__init__', '__new__', '__repr__', '__setattr__', '__sizeof__'] »> sorted({*r.__dict__} - {*c.__dict__}) ['__class__', '__eq__', '__format__', '__ge__', '__gt__', '__hash__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__reduce__', '__reduce_ex__', '__str__', '__subclasshook__'] »> sorted({*c.__dict__} - {*r.__dict__}) ['__abstractmethods__', '__base__', '__bases__', '__basicsize__', '__call__', '__dict__', '__dictoffset__', '__flags__', '__instancecheck__', '__itemsize__', '__module__', '__mro__', '__name__', '__prepare__', '__qualname__', '__subclasscheck__', '__subclasses__', '__text_signature__', '__weakrefoffset__', 'mro'] 考虑下面这个最简单的Python类： class Car: »> new_car = Car(make='Toyota', model='Prius', year=2005, engine='Hybrid') »> new_car(color='Green') »> new_car.description 'Toyota Prius 2005 Hybrid Green' 上面的例子包含了一些代码来处理初始化特性，也可以使用元类来完成这种任务：
class AttributeInitType(type): 这个元类只覆写实例类和对象创建部份功能。元类行为的所有其他方面仍由codice_54处理。现在可以重写类codice_5使用这个新元类：
class Car(object, metaclass=AttributeInitType): Ruby通过介入单例（singleton）类（或自称为eigenclass）提炼了Smalltalk-80的元类概念，去除了codice_16类，并重新定义了codice_63映射。变更可以图示如下：
注意在Smalltalk的隐含的元类和Ruby类的单例类之间的特定对应。Ruby的单例类模型使得隐式元类概念完全统一：所有对象codice_47，都有叫作codice_47的单例类的，它自己的元对象，它比codice_47高一个元层级。高阶单例类通常是纯粹概念上的存在，在大多数Ruby程序中它们不包含任何方法也不存储任何（其他）数据。
下面的示意图展示Ruby样例代码的核心结构。这里的灰色节点表示单例类，分别对应Smalltalk-80中的元类。
图示还展示了Ruby中单例类的惰性求值。codice_51对象可以有它的单例类，作为向codice_51增加“单例方法”的结果而被求值（被分配）。
在Objective-C中的元类几乎同于Smalltalk-80的元类，这是因为Objective-C从Smalltalk引进了很多东西。就像Smalltalk，在Objective-C中实例变量和方法是对象的类定义的。类也是对象，因此它是元类的一个实例。
就像Smalltalk，在Objective-C中类方法简单的是在类对象上调用的方法，因此一个类的类方法必须定义为在它的元类中的实例方法。因为不同的类有不同的类方法集合，每个类都必须有它自己单独的元类。类和元类总是成对创建：运行时系统拥有函数codice_69和codice_70来分别的创建和注册类-元类对。
元类没有名字，但是可以通过泛化类型codice_14，来引用到任何类对象的指针（类似于用于任何对象的指针的类型codice_72）。
因为类方法是通过继承而来的，就像Smalltalk，元类必须服从并行于类继承的继承方案（比如说如果类A的父类是类B，则A的元类的父类是B的元类），除了根类的元类之外。
不同于Smalltalk，根类的元类继承自根类（通常为使用Cocoa框架的codice_73）自身。这确保了所有的类对象最终都是根类的实例，所以人们可以使用根类的实例方法，通常是在类对象自身上的，有用的针对对象的实用方法。
因为元类没有表现得不同（人们不能为元类增加类方法，所以元类对象都有相同的方法），它们都是相同的类即根类的元类的实例（不同于Smalltalk）。因此，根类的元类是自身的实例。其原因是所有元类都继承自根类，因此它们必须继承根类的类方法。
下面是支持元类的一些最显著的编程语言。
资源描述框架（RDF）和统一建模语言（UML）二者都支持元类。