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

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

推荐阅读

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

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

  1. python采用面向对象编程模式吗_如何理解 Python 中的面向对象编程?

    现如今面向对象编程的使用非常广泛,本文我们就来探讨一下Python中的面向对象编程. 作者 | Radek Fabisiak 译者 | 弯月,责编 | 郭芮 以下为译文: Python支持多种类型的编 ...

  2. python如何初始化对象数组_如何理解Python中的面向对象编程?

    (由Python大本营付费下载自视觉中国) 作者 | Radek Fabisiak 译者 | 弯月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews) 现如今面向对象编程的使用非常广泛,本文 ...

  3. 如何理解 Python 中的面向对象编程?

    现如今面向对象编程的使用非常广泛,本文我们就来探讨一下Python中的面向对象编程. 作者 | Radek Fabisiak 译者 | 弯月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews ...

  4. 在 Python 中使用函数式编程的最佳实践!

    在函数式编程中,如何使用 Python 编写出优秀的代码? 作者 | Amandine Lee 译者 | 弯月 责编 | 屠敏 出品 | CSDN(ID:CSDNNews) 简介 Python 是一种 ...

  5. python支持函数式编程吗_利用Fn.py库在Python中进行函数式编程

    尽管Python事实上并不是一门纯函数式编程语言,但它本身是一门多范型语言,并给了你足够的自由利用函数式编程的便利.函数式风格有着各种理论与实际上的好处(你可以在Python的文档中找到这个列表): ...

  6. python中tk_可爱的 Python:Python 中的 TK编程

    可爱的 Python:Python 中的 TK编程 给使用 Python GUI 库的初学者的提示 David Mertz 博士 2000 年 12 月 01 日发布 我想要向您介绍能想像到的开始 G ...

  7. python汇率转换_利用Python中的Xpath实现一个在线汇率转换器

    前言 在之前的语法里面,我们记得有一个初识Python之汇率转换篇,在那个程序里面我们发现可以运用一些基础的语法写一个汇率计算,但是学到后面的小伙伴就会发现这个小程序有一定的弊端. 首先,它不可以实时 ...

  8. Python中的psutil:一个用于获得处理器和系统相关信息的模块

    http://www.crifan.com/try_python_psutil/ 无意间得知了psutil模块,去网上找了下,找到: http://pypi.python.org/pypi/psuti ...

  9. python中case的用法_如何在Python中使用TestCase实现一个断言功能

    如何在Python中使用TestCase实现一个断言功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题. Python TestCase断 ...

最新文章

  1. 更改记录表CDHDR和CDPOS
  2. [IOI2011]Race
  3. 锦欣生殖获战略投资,华平、信银领投,红杉、药明康德跟投
  4. 2015春计算机应用技术基础,计算机应用技术基础.doc
  5. VC下sql+ado数据库v_strTemp.vt == VT_NULL判断的问题
  6. 杭电4561 连续最大积
  7. 可以使用TrafficMonitor查看本机的网速情况
  8. 安装Scrapy失败的解决方法
  9. eclipse java环境配置_Eclipse怎么配置运行环境?
  10. I2C总线协议/地址详解
  11. 重磅!Google推出了AI人体图像分割工具,惊呆了小伙伴.....
  12. 漫画告诉你:区块链到底是什么?
  13. python自学难吗?零基础学python难吗?
  14. 濒死状态下的静息态网络激活和功能连接
  15. 7月18百度测试实习生二面经历
  16. ivue-admin Table单元格内换行问题
  17. 学习WordPress必须知道的函数(转)
  18. 计算斐波那契数列第100项(二维数组思维转换)
  19. storm the 少儿英语_幼儿英语课前热身游戏
  20. 音频编解码之G711

热门文章

  1. 一些关于Hibernate延迟加载的误区
  2. apache性能测试工具ab使用详解
  3. 浅析电商、社区、游戏常用的 MySQL 架构
  4. 自定义windows下自动清除文件夹或者文件的只读属性的脚本
  5. eclipse集成lombok
  6. Eigen::Matrix
  7. 阅读Book: MultiObjective using Evolutionary Algorithms (2) -- Multi-Objective Optimization: 各种解释多目标
  8. 计算机网络面试知识总结1
  9. MVP Summit 2008 照片纪实(二)- 旧金山,Google总部和Stanford大学
  10. 【青少年编程】马雷越:商品价格竞猜