python元编程详解

注意:本文仅用于记录,原文链接:https://www.jianshu.com/p/644d309b504e

 

python元编程详解

 

 

一、元编程的概念

元编程依赖于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的工具类



作者:黑加仑妞
链接:https://www.jianshu.com/p/644d309b504e
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
posted @ 2022-02-11 17:54  Rachel_0226  阅读(214)  评论(0编辑  收藏  举报