大家好,又见面了,我是全栈君 简单定义“元编程是一种编写计算机程序的技术,这些程序可以将自己看做数据,因此你可以在运行时对它进行内审、生成和/或修改”,本博参考<<Python高级编程>>将对元编程内容进行详细描述 概述 Python元编程有两种方法,一是采用类似“装饰器”的工具对基本元素(例如函数、类、类型)内审和对其进行实时创建和修改,二是运用类型”元类”的方式对类实例的创建过程进行修改,甚至于允许重新设计 Python面对对象编程范式的实现。 2. ’> >>> 1 >>> (<__main__.MyClass object at 0x01A02270>,2) 3.2 元类的常用模板 #coding=utf-8 '''元类模板 ''' class
元编程 什么是元编程 维基百科上的解释为: 元编程(英语:Metaprogramming),又译超编程,是指某类计算机程序的编写,这类计算机程序编写或者操纵其它程序(或者自身)作为它们的资料,或者在运行时完成部分本应在编译时完成的工作 知乎上有一个关于元编程的解释是比较直观的。 ,那么编写程序乙的活动,就可以算作 meta-programming,「元编程」。 那我们看看Julia中的元编程到底是什么及如何应用? Macro也是Julia元编程的一个重要应用,Macro是一种规则,或称为语法替换,这种替换在预编译时进行,Macro在运行时没有像函数似的调用时间。
__dict__) print(user.age) # 调用`IntField`中的`__get__`方法 # 元类 元类是创建类的类. type -> class -> 对象 ) User = type("User", (Base,), {"test": test, "name": "zhangsan"}) user = User() user.test() # 自定义元类 自定义元类需要通过继承type实现 如果父类有metaclass,则子类和父类的创建都需要通过该元类实例化得到。 BaseMeta __new__.. zhangsan 元类的经典例子是django ORM
image.png image.png image.png
元编程 编译期执行的变成,类似宏定义和模板,再编译期需要展开实现 宏定义 #define ARG_COUNTX(…) A1X(VA_ARGS) #define A3X(x) x //使宏定义在同一级展开 #define A1X(…) A3X(A4X(VA_ARGS, 3, 2, 1, 0)) #define A4X(1, 2, 3, count, …) count A4X最大3个元素计数的宏定义 POINT_OFFSET_1(TYPE,MEMBER,...) m_FieldOffset.emplace_back(OFFSET(TYPE,MEMBER)); #define POINT_OFFSET_2( POINT_OFFSET_1(TYPE,MEMBER) PREPARE_MACRO(POINT_OFFSET_2(TYPE,__VA_ARGS__)) #define REGISTER_OFFSET(TYPE POINT_OFFSET_3(TYPE,__VA_ARGS__)) REGISTER_OFFSET(A,a,b,c)//遍历A的成员地址 for循环 宏定义循环可以通过,类似上面的宏递归展开方式实现 模板元编程
元编程的概念有很多文章,通过操作更加底层的api做更多个性化的功能。 此外,symbol是不可枚举的: const only = Symbol(); const obj = { a: 1, b: 2 }; obj[only] = 'xxx'; Object.keys(obj yield 3; }; [...fakeArr] // [1,2,3] // 方法2 var arr = { 0: 1, 1: 2, 2: 3, length: 3, [ btn1: { renderer() { return 1 }, style: { height: '10px' } }, btn2: ) { case 'btn1': yield this.btn1 break; default: yield this.btn2
下午的时候,张大胖洋洋得意地给Bill展示自己的工作成果,Bill说:“不错啊,都开始元编程了!” “元编程?” “对啊,你不是用程序来生成程序嘛,这就是一种元编程。” 张大胖没想到的工作居然就是高大上的“元编程”,更高兴了。 “还有,如果把CSV文件看成数据库的表,代码生成器自动生成的EmployeeParser不就相当于DAO吗? Bill 笑道:“你可以用动态语言,比如Ruby,元编程很强大,实现你这个功能简直是小菜一碟。” Bill问道:“怎么样,元编程不错吧?” Bill说:“其实吧,编程语言中,元编程能力最强大的还属LISP,在LISP当中,程序和数据的表现形式是一致的,造就了它无以伦比的元编程能力,LISP程序可以像操作数据一样操作代码。
Python元编程被称为“黑魔法”。Python界的传奇人物Tim Peters有云: 引用 Python的元编程这种黑魔法99%的人都无需了解,如果你拿不准是否应该用到它时,你不需要它. OpenERP基本遵循了Tim Peters的教诲,但是却在6.1版本之后忍不住触及了一点点, Technorati 标签: Openerp,Python,元编程 从此游走于黑白两道之间:) 其实 : a = A(2) In [3]: a Technorati 标签: Openerp,Python,元编程 Out[3]: <__main__.A at 0x2ff2fd0> a就是类A的一个实例对象 我们首先要了解什么是类的实例化,或者类的调用到底是怎样的一个过程,比如上例中A(2),其实其执行过程基本上可以分为两个部分,用Python 来表示就是: 程序代码: [选择] n = A. __new__(A, 2) #创建类的实例对象 if isinstance(n, A): A.
元编程作为一种新兴的编程方式,受到了越来越多的广泛关注。结合已有文献和个人实践,对有关 C++ 元编程进行了系统的分析。 由于元编程不同于一般的编程,在程序设计上更具有挑战性,所以受到了许多学者和工程师的广泛关注。 1.4 元编程的语言支持 C++ 的元编程主要依赖于语言提供的模板机制。 2. 元编程的基本演算 C++ 的模板机制仅仅提供了 纯函数 (pure functional) 的方法,即不支持变量,且所有的推导必须在编译时完成。 当调用 _Factor<2> 时,编译器会展开为 2 * _Factor<1>,然后 _Factor<1> 再展开为 1 * _Factor<0>,最后 _Factor<0> 直接匹配到参数为 0 的重载 元编程的主要难点 由于 C++ 语言设计层面上没有专门考虑元编程的相关问题,所以实际元编程难度较大。元编程的难点主要有四类:复杂性、实例化错误、代码膨胀、调试模板。
提到元这个字,你也许会想到元数据,元数据就是描述数据本身的数据,元类就是类的类,相应的元编程就是描述代码本身的代码,元编程就是关于创建操作源代码(比如修改、生成或包装原来的代码)的函数和类。 主要技术是使用装饰器、元类、描述符类。本文的主要目的是向大家介绍这些元编程技术,并且给出实例来演示它们是怎样定制化源代码的行为。 是外套,decorator2 是内衣。 我们可以通过编程的方式来实现自定义的一些对象创建行为。 定一个类继承 type 类 A,然后让其他类的元类指向 A,就可以控制 A 的创建行为。 or float >>> c = Component('WIDGET', 'metal', 5) # Allowed: The inputs are valid 最后的话 关于 Python 的元编程
所有用于读取、分析、转换或修改自身的程序都是元编程的例子。 然后,讨论了在Python中元编程的方法以及元编程如何简化某些特定类型的任务。 一点自我反省 如果你已经由一些Python编程经历,你可能知道那句话:Python中一切皆对象,类创建对象。 type 是 Python 中一个内建的元类,来控制Python中类的行为,我们可以通过继承自 type 来自定义一个元类。元类是Python中进行元编程的途径。 但是,在我们实现通过元类注入行为之前,让我们来看看Python中更常见的实现元编程的方法。 现在你知道了Python中如何编写元类。 总结 在这篇文章中,介绍了Python中实例,类和元类的关系。也展示了元编程的知识,这是一种操作代码的方法。
首先,我们且不说元编程是什么,他能做什么.我们先来谈谈生产力. 可以说,社区内,成功的web框架中基本没有不强依赖元编程技术的,框架做的工作越多,应用编写就越轻松. 那什么是元编程 元编程是写出编写代码的代码 试想以下,如果那些原本需要我们手动编写的代码,可以自动生成,我们是不是又更多的时间来做更加有意义的事情? 有些框架之所以开发效率高,其原因也是因为框架层面,把大量的需要重复编写的代码,采用元编程的方式给自动生成了. Java元编程的几种姿势 反射(reflection) 自省 我们要生成代码,我至少得知道我们现有的代码长什么样子吧?
魔 法 元类编程 在介绍元类编程前,我们先回顾下前面的内容,在之前的文章我们有了解过python的面对对象编程的基本实现机制就是魔法函数,而在python3中,新型类统一了类和类型的概念。 元 类 metaclass metaclass 直译过来就是元类 简单的解释就是: 当我们定义了类以后,就可以根据这个类创建出实例,所以:先定义类,然后创建实例。 但是如果我们想创建出类呢? 那就必须根据metaclass创建出类,所以:先定义metaclass,然后创建类就是元类编程。 应 用 一个单例模式 元类使类的创建行为发生了改变,当用户定义一个class Logger()时,Python解释器首先在当前类Logger的定义中查找metaclass,找到了,就使用Logger 就元类本身而言,它的作用是: 1.拦截类的创建 2.修改类 3.返回修改之后的类 使用元类还是有一些好处的: 1.意图更加明确。当然你的metaclass名字要起好 2.面向对象。
zhuanlan.zhihu.com/p/426966480 其实复杂类型操作并非无迹可寻,本文就试图从元编程的角度挖掘一下类型系统的潜力,希望能够帮助你抓到一些思路和脉络。 元编程的基础是图灵完备的子系统,那么TypeScript类型系统是否是图灵完备的呢?答案当然是肯定的。 TypeScript类型系统的extends ? v2 extends true ? fromBinary<binaryAdd<[...count<10, 0>, 1], [...count<9, 0>, 1, 0]>>; 复制代码 小试牛刀 好了,上面的例子都比较简单,似乎缺少一些元编程的味道 ts=4.5… 好了,如果你看到这里,相信对TypeScript类型元编程已经有了初步的了解,接下来可以把它灵活运用到日常工作中啦。
2.模板元编程的作用 C++ 模板最初是为实现泛型编程设计的,但人们发现模板的能力远远不止于那些设计的功能。 元函数只处理元数据,元数据是编译期常量和类型,所以下面的代码是编译不过的: int i = 1, j = 2; meta_func<i, j>::value; //错误,元函数无法处理运行时普通数据 与此同时,模板元编程也存一定缺点,主要有: (1)模板元编程产生的代码较为复杂,难易阅读,可读性较差; (2)大量模板的使用,编译时容易导致代码膨胀,提高了编译时间; (3)对于C++来说,由于各编译器的差异 所以,对于模板元编程,我们需要扬其长避其短,合理使用模板元编程。 ---- 参考文献 [1]C++11模版元编程 [2]C++模板元编程(C++ template metaprogramming) [3]c++模板元编程五:switch/case语句编译时运行
theme: condensed-night-purple 背景 首先还是来说下为什么出现元编程? 一个技术的出现肯定是不满足现状,那么元编程的出现是为了解决什么问题呢? 通过元数据描述类,变量,函数信息 什么是元编程 直接说定义:操作元数据的编程就是指元编程。 比如我们通过反射获取类,属性,方法的一些信息,进而操作他们这也叫元编程。 所以上面说到反射也算元编程的范畴。 但是这么说又太片面了,反射是通过程序获取数据,而元编程还包括通过数据获取程序。即“程序即是数据,数据即是程序”。 可以这么说元编程是更高阶的抽象,高阶函数用函数作为输入输出。而元编程用程序作为输入输出。 所以编译器承担了 解语法糖 的角色,编译器作为外部程序去操作这些语法糖(本质也是元数据)也叫作元编程 2.获取运行时数据(反射) 3.动态执行代码(目前无法做到) 元编程需要一定的学习成本,需要了解class
在Python中,类也是对象,因此我们可以通过元类来动态地创建和修改类。元类是一种用于创建类的类,它可以在类定义阶段拦截和修改类定义的过程,从而实现各种高级的功能,例如类型检查、代码生成、反射等。 元类通常继承自type类,通过重载__new__方法来实现类的创建和修改。__new__方法接收三个参数:cls、name和bases,分别表示元类本身、类名和基类。 attrs['x'] = 1 attrs['y'] = 2 attrs['foo'] = lambda self: print('foo') ) # 输出:1print(MyClass.y) # 输出:2MyClass().foo() # 输出:foo在上面的示例中,我们定义了一个名为MyMeta的元类,用于自动添加类的属性和方法 然后,我们使用元类创建名为MyClass的类,使用metaclass参数指定元类为MyMeta。在创建类时,元类会自动添加x、y和foo属性和方法到类中。
前言 通常我们创建类都是使用class 类名,但是小伙伴们有没有想过,类是由谁来创建的呢,python中常说的万物皆对象,对象是由类创建的,那类本身也可以看做是对象,类可以由元类type创建 type __name__) 结果 Per 所以为了程序代码更加友好,一般变量名和设置的类名保持统一 案例2:使用type创建带有属性(方法)的类 def show(self): print("展示自己
元编程 元编程的主要思想是用程序在运行时写代码,再在运行时在编译代码。 元编程又被称为两级编程 (two-level programming),生成式编程 (generative programming) 或 模板元编程 (template metaprogramming) 反射是促进元编程的一种很有价值的语言特性,所以大多数支持反射的语言都支持元编程(类似字符串到代码,代码到字符串) c++的元编程,在编译期 参考:https://github.com/Binary-Song
1.1.propety动态属性 在面向对象编程中,我们一般把名词性的东西映射成属性,动词性的东西映射成方法。在python中他们对应的分别是属性self.xxx和类方法。 (2)加了__getattr__之后就可以调用了 class User: def __init__(self,info={}): self.info = info #_ (2)返回对象就会执行init方法 class User: def __new__(cls, *args, **kwargs): print("in new") <locals>.User'> (2)用type创建 虽然上面的方法能够创建,但很麻烦,下面是type创建类的一个简单实例 # 一个简单type创建类的例子 #type(object_or_name, 元类就是创建类的类,比如上面的type 在实际编码中,我们一般不直接用type去创建类,而是用元类的写法,自定义一个元类metaclass去创建 # 把User类创建的过程委托给元类去做,这样代码的分离性比较好