关于元类,实际上很少会用到,但是了解一下也是有必要的,因为元类个很神奇的东西。
python中的类
在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在Python中这一点仍然成立。但是,Python中的类也是一种对象。只要你使用关键字class,Python解释器在执行的时候就会创建一个对象。下列代码:
class ObjectCreator(object):
pass
将在内存中创建一个对象,名字就是ObjectCreator。这个对象(类)自身拥有创建对象(类实例)的能力,这说明它是一个类,但它的本质仍然是一个对象。
神奇的type方法
还记得内建函数type吗?这个古老但强大的函数能够让你知道一个对象的类型是什么,就像这样:
print(type(1)) #<class 'int'>
print(type('1')) #<class 'str'>
print(type(ObjectCreator)) #<class 'type'>
print(type(ObjectCreator())) #<class '__main__.ObjectCreator'>
此外,type还有一种完全不同的能力,它能动态的创建类。type可以接受一个类的描述作为参数,然后返回一个类。
type可以像这样工作:
type(类名, 父类的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))
示例:
MyClass = type('MyClass', (), {'author':'trophy'}) # 返回一个类对象
print(MyClass) #<class '__main__.MyClass'>
print(MyClass.author) #trophy
print(MyClass()) #<__main__.MyClass object at 0x0000001FD980>
你可以看到,在Python中,类也是对象,你可以动态的创建类。这就是当你使用关键字class时Python在幕后做的事情,而这就是通过元类来实现的。
到底什么是元类
Python中的类也是对象,那么元类就是用来创建这些类(对象)的,元类就是类的类。
type就是Python在背后用来创建所有类的元类。我们都知道,str是用来创建字符串对象的类,int是用来创建整数对象的类。type就是创建类对象的类,你可以通过检查__class__属性来看到这一点。Python中所有的东西都是对象,这包括整数、字符串、函数以及类。它们全部都是对象,而且它们都是从一个类(元类type)创建而来。
看完下面的例子就懂了:
a = 1
print(a.__class__) #<class 'int'>
print(a.__class__.__class__) #<class 'type'>
b = 'hello'
print(b.__class__) #<class 'str'>
print(b.__class__.__class__) #<class 'type'>
c = type('NewClass', (), {})
print(c().__class__) #<class '__main__.NewClass'>
print(c().__class__.__class__) #<class 'type'>
元类的使用
一般来说,我们根本就用不上元类:
元类就是深度的魔法,99%的用户应该根本不必为此操心。如果你想搞清楚究竟是否需要用到元类,那么你就不需要它。那些实际用到元类的人都非常清楚地知道他们需要做什么,而且根本不需要解释为什么要用元类。” —— Python界的领袖 Tim Peters
元类的主要用途是创建API。一个典型的例子是Django ORM,好奇的自己去google了解了解吧~
参考原文:深刻理解Python元类