前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python中的元编程:一个关于修饰器和元类的简单教程

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

作者头像
AI科技大本营
发布2019-10-24 14:56:33
7270
发布2019-10-24 14:56:33
举报
文章被收录于专栏:AI科技大本营的专栏

作者 | 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)

推荐阅读

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI科技大本营 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是元编程?
  • 修饰器
  • 元类
  • 推荐阅读
相关产品与服务
SD-WAN 接入服务
SD-WAN 接入服务(SD-WAN Access Service)助力多分支轻松实现与云、数据中心的任意互联,具有即插即用、多地域覆盖、智能管控等特性,为企业多分支提供了更简单、可靠、智能的一站式上云的体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档