python元编程 实际应用_Python中的元编程:一个关于修饰器和元类的简单教程

作者 | Saurabh Kukade

译者 | 刘畅

出品 | AI科技大本营(ID:rgznai100)

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

什么是元编程?

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

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

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

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

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

修饰器

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

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

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

最直接的方式是向所有三个函数添加打印/日志语句。但这听起来像是重复性的工作,我们得需要修改每个函数体。

我们能做得更好吗?当然可以,因为我们是程序员,程序员是最聪明的。我们可以通过编写修饰函数并且不修改任何现有的函数主体来实现这一点。

真棒!在上面的代码片段中,my_decorator 是一个修饰函数。我们用 @my_decorator 来修饰这三个功能,我们并没有接触到现有的函数主体来添加这个输出功能。

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

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

元类

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

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

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

举个例子,如果我们有一个带有三个类方法的 Calc 类,并且我们想为其中一个类中的所有方法提供调试功能,那么我们可以为此使用一个元类。

首先,我们需要创建一个具有调试功能的元类 MetaClassDebug,并使 Calc 类继承 MetaClassDebug。

而且,当我们从 Calc 类调用任何方法时,它将被我们的 debug_function 调用。

这样,我们可以向类中的所有方法添加新行为,还可以使用元类控制类的实例创建。通过使用元类,我们可以取得很多成就,例如在类中添加方法或字段,从类中删除方法或字段等等。

原文链接:

https://medium.com/better-programming/meta-programming-in-python-7fb94c8c7152

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

推荐阅读

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值