`
huangxiaoshi8896513
  • 浏览: 8629 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

简要介绍python的元编程的metaclass

 
阅读更多

具体请点击:http://www.verydemo.com/demo_c122_i20324.html

平时经常看到元编程、DSL这样的字眼,它到底是什么意思?
我的理解来看。元编程就是“代码生成器”,你可以通过一些代码生成另一些代码(动态地、按需的)。DSL则是domain special language:为了解决某个问题而发明的语言,比如HTML SQL YACC,它的反面是C JAVA Python这些通用语言。与DSL经常提到的是ruby,为什么说ruby可以DSL呢?因为它语法丰富,支持各种简写,lamba,闭包,block等等,通过自定义的一套高级API从而实现一门特定领域的方言。这种方言是可以交给客户写的。


python中元编程的目标是:动态生成需要的类class。我们知道class实例化后就是instance,而python中的metaclass实例化后就是class了。先看一个例子
class MyMeta(type):  
    def __new__(cls, name, parents, attrs):
        print("new info: ", cls, name, parents, attrs)
        attrs['abcde'] = 'fghijk'
        return type.__new__(cls, name, parents, attrs)

class C(metaclass=MyMeta):
    pass

print(C.abcde)

输出结果是:
引用
fghijk

通过修改__new__里面的attrs就可以更改类的属性

python类在初始化的时候,经历了两个阶段,第一个阶段是分配空间__new__(),第二个阶段是初始化值__init__()。当类被创建时,python2会首先寻找__metaclass__是否存在,如果存在则调用__metaclass__。如果此类没定义__metaclass__就去看父类,父类没有就去模块里找(全局变量__metaclass__),包里再没有就把__metaclass__ = type作为类的metaclass。而python3先看自己metaclass有没有定义,如果没有就看父类,父类没有就用type

再介绍下__new__中各个参数的意思:cls代表调用__new__函数的class,name代表对象的__name__值,也就是名称,parents代表对象的父类元组,attrs代表类的属性字典。

metaclass功能就是这么简单,一般来说是用不上的,除非要大批量的修改类的属性。其实python本身就是动态语言,在运行时就可以更改属性。而且decorator也可以很好的修改调用对象前后的行为。所以metaclass了解就行。

metaclass还有一些比较边边角角的知识点,比如说MyMeta这里还会引入一个__prepare__函数:
    #官方文档说要是classmethod类型
    @classmethod
    def __prepare__(self, *args, **kwargs):
        print("__prepare__ called")
#        return type.__prepare__(self, *args, **kwargs)
        return kwargs

这个函数还要在__new__函数调用之前调用,这个函数必须返回一个用于存放类属性(namespace)的数据结构,默认情况下就是字典类型了。我在这里直接就把kwargs返回就可以,没问题的,极端点,return {}都是可以的。这里可以玩一下,比如说
return {'xx': 'yy'}

你会发现整个类中都会被添加xx这个属性……

最后附上几个小知识点:
#可以使用type动态创建一个类
myclass = type("MyClass", (), {})
print(myclass)
s = super(myclass, myclass())
#super其实返回一个super object
print(s)
#输出结果是:
<super: <class 'MyClass'>, <MyClass object>>
分享到:
评论

相关推荐

    python网络编程第3版pdf

    Python是一种功能十分强大的面向对象编程语言,可以用于编写独立程序、快速脚本和复杂应用的原型。作为一种开源软件,Python可以自由获取,而且非常易学易用。本书是Python语言的经典入门读本,由两名顶尖的Python...

    python少儿趣味编程视频教程全套-Python少儿趣味编程.pdf

    python少⼉趣味编程视频教程全套-Python少⼉趣味编程 Python简单易学,功能强⼤,是少⼉学习编程的⾸选语⾔。本书是少⼉学习Python编程的趣味指南,全书共17章,按照由简到难、逐步 深⼊的⽅式组织各章内容。本书从...

    python快速编程入门(第2版)课后答案.pdf

    python快速编程⼊门(第2版)课后答案 1. Python概述 填空题 1. 对象 2. 可移植性 3. Python 4. import 5. from…import * 判断题 1. 2. × 3. × 4. 5. 选择题 1. C 2. D 3. C 简答题 1. Python主要的特点有代码...

    少儿编程python教案-初识Python.pptx

    初识Python 少儿编程python教案——初识Python全文共24页,当前为第1页。 Python基本概念 海龟编辑器 绘图准备 课程知识点 使用画笔 少儿编程python教案——初识Python全文共24页,当前为第2页。 Python基本概念 ...

    python趣味编程100例(99个)

    python趣味编程100例(99个),从简单到复杂的Python案例代码,代码可以允许,本人测试过,需要的朋友可以自行下载。

    Python硬件编程实战

    在对Python建立基本概念的前提下,循序渐进地引导读者学习Python版本的选择、不同平台下Python开发环境的搭建、Python基本的语法,并最终使读者可以利用Python实现一些简单的应用开发。, 《Python硬件编程实战》主要...

    Python网络编程实战指南.docx

    本文将详细介绍Python网络编程的实战指南。 一、Python网络编程入门 Python网络编程主要通过socket模块来实现。我们可以在Python中使用socket模块来实现TCP、UDP、HTTP等多种协议的网络编程。下面简单介绍一下socket...

    python简单编程实例.docx

    在这篇文章中,我们将介绍一些Python的简单编程实例,帮助初学者更好地理解Python的基础知识。 1. 计算器 计算器是一个非常简单的Python编程实例。我们可以使用Python编写一个简单的计算器程序,让用户输入两个数字...

    Python快速编程入门教程.pdf

    学习目标: 1、了解python发展历程、特点、应用领域; 2、掌握python的执行原理; 3、掌握pycharm简单编写python程序; 4、了解python开发环境配置;

    python入门教程pdf-python基础教程:《Python编程无师自通》PDF版百度云下载.pdf

    python⼊门教程pdf-python基础教程:《Python编程⽆师⾃ 通》PDF版百度云下载 近年来,学习编辑的朋友可以说是越来越多了。其实这是有原因,毕竟未来的⾏业⾥⾯,IT⼀⾏可以说是会⼀直很⽕爆的,学好⼀门编程, 不管...

    python编程入门指南-编程入门指南.pdf

    课程内容:计算概念,Python 编程语⾔,⼀些简单的数据结构与算法,测试与调 试。 2. · 完成 Harvard CS50x (哈佛⼤学:计算机科学)。 同样是导论课,但这门课与MIT的导论课互补。教学语⾔涉及 C, PHP, ...

    python并行编程 中文版

    本章最后简单介绍了Python编程语言。Pyhton的 易用和易学、可扩展性和丰富的库以及应用,让它成为了一个全能性的工具,当然,在并行计算方面也得 心应手。最后结合在Python中的应用讲了线程和进程。解决一个大问题...

    Python硬件编程实战.李茂(带详细书签)

    在对Python建立基本概念的前提下,循序渐进地引导读者学习Python版本的选择、不同平台下Python开发环境的搭建、Python基本的语法,并最终使读者可以利用Python实现一些简单的应用开发。 《Python硬件编程实战》主要...

    python实现的简单的class解析以及简单执行class.zip

    python实现的简单的class解析以及简单执行class,使用python2解析java class文件,并简单执行 class,让大家更加了解class

    Python 核心编程 第二版

    第2部分则提供了各种高级主题来展示可以使用Python做些什么,包括正则表达式、网络编程、网络客户端编程、多线程编程、图形用户界面编程、 Web编程、数据库编程、扩展Python 和一些其他材料。  本书适合Python初学...

    (完整版)Python快速编程入门教程

    Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言, 随着版本的不断更新和语言新功能的添加,逐渐被...

    大一python基础编程题水果-教程简单教程:用Python解决简单的水果分类问题....pdf

    ⼤⼀python基础编程题⽔果_【教程】简单教程:⽤Python解 决简单的⽔果分类问题... 在这篇⽂章中,我们将使⽤Python中最流⾏的机器学习⼯具scikit- learn,在Python中实现⼏种机器学习算法。使⽤简单的数据集来训练分...

    Python核心编程(第二版)高清带书签

    Python核心编程 (第二版) 高清带书签, 本书适合Python初学者,以及已经入门但想继续学习和提高自身Python技巧的程序员。 Python是一种功能十分强大的面向对象编程语言,可以用于编写独立程序、快速脚本和复杂应用的...

    python编程爱心代码.docx

    python编程爱心代码 Python编程爱心代码 Python是一种高级编程语言,它的语法简单易懂,适合初学者入门。Python的应用范围非常广泛,包括数据分析、人工智能、Web开发等领域。在这篇文章中,我们将介绍如何用Python...

    python简单编程实例(1).docx

    在这篇文章中,我们将介绍一些Python的简单编程实例,帮助初学者更好地理解Python的基础知识。 1. 计算器 计算器是一个非常简单的Python编程实例。我们可以使用Python编写一个简单的计算器程序,让用户输入两个数字...

Global site tag (gtag.js) - Google Analytics