一、元编程的概念
元编程依赖于python的一个叫做元类的概念。元类就是当你的某段代码在被执行的过程中,另外一段代码同时在被执行。维基百科上说的很好,在面向对象编程中,元类的实例还是类。
当我们定义一个类时,该类的对象都是由这个类来创建。但是类本身呢?类又是由什么来创建的呢?
这个问题就引申出元类的概念了,元类可以为其他类定义属性。举个例子,下面这段代码为每个类添加了一个hello属性,而这些类都是由定义的元类创建。也就是说,这些类都会有一个hello的属性,并不需要他们自己去定义。
运行上面的代码,得到下面的结果:
我们可以看到,我们并没有在TryHello里面定义hello的方法,但是这个方法被自动执行了。因为TryHello使用了HelloMeta作为元类,所以在调用hello方法时,没有发生错误。所以,通过上面的例子,我们可以想到,我们可以使用元类为由元类创建的类自动新增一些方法。所以,元类的一个好处就是,在你还没有意识到的时候,神奇的事情就发生了。
下面这些框架就很好的使用到了元类,他们帮助你在编程过程中,书写更少的代码。
Django
SQLAlchemy
Flask
Theano
二、理解元类到底是怎么工作的
要搞清楚元类的概念,首先要弄懂python的type的概念。请看下面的代码示例:
可以看到,day的类型是str,字符串类型,我们可以使用内置的type()方法来查看对象的类型
1、查看类的类型
我们知道"Sunday"的类型是字符串类型str,那str又是什么类型呢?
通过上面的代码我们可以看到str的类型是type
2、<type>的类型
通过上面的代码我们可以看到type不仅仅是其他类型的元类,它也是它自己的元类
3、元类使用的特殊方法
type类型作为python的默认元类,定义了一些特殊的方法,这些方法可以被元类重写,将其定义成自己特有的方法,下面是这些魔术方法的一个清单:
__init__:初始化方法
__prepare__:定义类的命名空间
__call__:当新类被调用创建对象时被使用
三、元编程练习
1、练习一:使用装饰器
python中元编程被使用最广泛的一个位置就是装饰器,装饰器就是用来改变某个方法执行行为的一类方法。换句话说,装饰器就是以某个方法为输入,然后输出另外一个方法。举个例子如下:
执行结果如下:
从上面的代码可以看到,装饰器达到了元类的效果,而且比元类更加的简单。
2、练习二:使用元类
下面我们使用元类达到练习一的效果,大家可以对比一下
可以看到使用元类也同样达到了装饰器的效果。
四、元类的例子
1、例子一:实现一个类不能创建其子类
元编程最普遍的一个用法就是控制类的实例。比如,单例模式在很多地方被用到,一个单例类控制该类只能创建一个实例。下面的这个例子就是控制类的使用,我们使用元类限制该类被其他类继承。
通过上面的例子,我们可以看到当我们想要创建Final类的子类的时候发生了错误
2、例子二:创建一个记录执行时间的类
下面这段代码,使用了元类去记录代码的执行时间
通过上面的代码我们可以看到,每次使用Timed元类的时候,都会自动调用timer的工具类