Python中的元编程:一个关于修饰器和元类的简单教程

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/102694150
640?wx_fmt=jpeg

作者 | Saurabh Kukade
译者 | 刘畅
出品 | AI科技大本营(ID:rgznai100)

最近,作者遇到一个非常有趣的概念,它就是用 Python 进行元编程。我想在本文中分享我对该主题的见解。作者希望它可以帮助解决这个问题,因为很多人说这是一个很令人头疼的难题。

什么是元编程?

用一句话来说:“元编程是一种编写代码去操纵代码的行为。”

等一下,是的,你没有看错,代码操纵代码,听起来是不是很迷人很有力量? 好吧,实际上是的。

在python中,元编程可以表述为:“元编程是一种构建函数和类的行为,可以通过修改、包装现有代码或生成代码来操作代码。” 泛泛来说,只要是与编程相关的编程就算是元编程了。举个例子来说,若编程甲可以输出 A - Z,那么写程序甲算「编程」;而程序乙可 以生成程序甲( 也许还会连带着运行它输出 A - Z),那么编写程序乙的活动,就可以算作 meta-programming 了。

Python中的元编程可以通过以下方式实现:一是修饰器,二是元类。

接下来,让我们一一去熟悉它们。

修饰器

修饰器是一种在现有函数中添加新的功能而不修改其原始结构的方法。

例如,我们有以下三个函数:

           640?wx_fmt=png                                                    
现在我们需要在函数被调用时输出函数名和参数值。这应适用于上述所有三个函数。

最直接的方式是向所有三个函数添加打印/日志语句。但这听起来像是重复性的工作,我们得需要修改每个函数体。
       640?wx_fmt=png
我们能做得更好吗?当然可以,因为我们是程序员,程序员是最聪明的。我们可以通过编写修饰函数并且不修改任何现有的函数主体来实现这一点。
       640?wx_fmt=png        
真棒!在上面的代码片段中,my_decorator 是一个修饰函数。我们用 @my_decorator 来修饰这三个功能,我们并没有接触到现有的函数主体来添加这个输出功能。

所以,基本上,修饰器是个高阶函数,它们将一个函数作为参数,并返回另一个函数。在这里,my_decorator 将函数作为参数,并返回 wrapper_function,其中 wrapper_function 将我们的输出功能添加到 func 中。

当然,修饰器还有其他更多功能,但这只是 Python 中修饰器的简要介绍。

元类

现在我们已经了解了修饰器,他们的功能是修饰函数。但是元编程比修饰器更重要,例如元类。

元类是类的特殊类型,而不是 Python 中的普通类。在普通类定义其自身实例的行为时,元类定义了普通类及其实例的行为。

元类可以向普通类添加或删去方法或字段。python 中有一个特殊的类,叫类型类,默认情况下它是一个元类。所有自定义类型类都必须从类型类继承。

举个例子,如果我们有一个带有三个类方法的 Calc 类,并且我们想为其中一个类中的所有方法提供调试功能,那么我们可以为此使用一个元类。
         640?wx_fmt=png      
首先,我们需要创建一个具有调试功能的元类 MetaClassDebug,并使 Calc 类继承 MetaClassDebug。

而且,当我们从 Calc 类调用任何方法时,它将被我们的 debug_function 调用。
          640?wx_fmt=png   640?wx_fmt=png
 
这样,我们可以向类中的所有方法添加新行为,还可以使用元类控制类的实例创建。通过使用元类,我们可以取得很多成就,例如在类中添加方法或字段,从类中删除方法或字段等等。

原文链接:
https://medium.com/better-programming/meta-programming-in-python-7fb94c8c7152

(*本文为 AI科技大本营编译文章,请微信联系 1092722531


精彩推荐


20 19 中国大数据技术大会(BDTC)再度来袭! 豪华主席阵容及百位技术专家齐聚, 15 场精选专题技术和行业论坛,超强干货+技术剖析+行业实践立体解读,深入解析热门技术在行业中的实践落地。

即日起,限量 5 折票开售,数量有限,扫码购买,先到先得!

640?wx_fmt=jpeg

推荐阅读

640?wx_fmt=png

你点的每个“在看”,我都认真当成了AI

猜你喜欢

转载自blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/102694150