`

关于Metaclass Programming (一)—— 动态创建Class

阅读更多

        前几天写Python中的Class这篇Post的时候,犯下了一个十分低级的错误,让我感觉十分惭愧。看来还是得继续努力,坚持大胆假设,细心求证的基本原则哦,呵呵~~~
        言归正传,Qiangning Hong兄的Feedback不仅纠正了我犯下的错误,也促使了我去作进一步的思考。我原本希望通过Google去搜索Python中关于函数重载的内容,却很意外地发现了这样一个与Python有关的名词:Metaclass(元类)。在查阅了相应的资料并对Metaclass有了一定的了解之后,我不禁赞叹拥有Metaclass的Python真的太奇妙了!
        在OO的世界里,Class就像是一份specification,某一个Class的instance就是依据这样的specification去创建的。程序可以在运行期创建很多不同的instance,但是作为instance的specification的Class则在编译期就必须被定义好。Class似乎是OO世界里的特权执行者,依据Class创建的instance,既不能少掉一个属性或者方法,也不能够在运行期增加属性和方法。而对于Class本身而言,我们没有办法在运行期创造一个Class,哪怕是在Java Platform下使用了强大的反射机制,也仅仅能够把Class当作OO世界里的一个特殊对象。但是,在Python的地盘,Class那高高在上的地位就不复存在了:Class定下的契约,instance并不需要100%的遵守,你可以随意为instance增减属性,也可以任意增减instance的方法;Class可以作为function的返回值;Class可以在运行期被创建等等。
        与创建instance相应的,为了创建Class,也需要一份specification,那么这份specification就是Metaclass。以下的例子说明了在运行期创建Class的方法[1]

>>> def class_with_method(func):
        
class klass: pass
         setattr(klass, func.__name__, func)
        
return klass

>>> def say_foo(self): print 'foo'

>>> Foo = class_with_method(say_foo)
>>> foo = Foo()
>>> foo.say_foo()

在class_with_method这个function中,首先动态构造了一个Class——klass,接着将参数这个function(就是func)作为klass实例的方法,最后klass作为class_with_method的返回值返回。这是一个很有意思的情形,function中可以创建Class,而Class中也包含不同的function作为Class的类方法,function与Class之间的地位是平等的。
        虽然例子当中展示了动态创建Class的方法,但是这里并没有metaclass存在。尽管如此,我们依然可以从class_with_method这个function找寻到metaclass的影子。Metaclass是创建Class的模板,正如Class是创建instance的模板一样,而在class_with_method这个function中定义了Class的模板,当然这个模板是很简单的,仅仅是为一个function套上了Class的面具。那么真正的Metaclass又会是怎么样的呢?我在以后的Post中接着说。[2]
        Metaclass Programming是一个涉及面很广的问题,有兴趣的朋友可以参考下面链接的文章。

        [1] Python中的元类编程Metaclass Programming in Python
        [2] 在看了Python前辈limodou的Feedback之后,增补了这样一段话以说明一些模糊的地方。谢谢limodou兄的批评!
分享到:
评论

相关推荐

    meta-programming简介

    元编程(Meta-programming)是一种高级的编程技巧,它允许程序员在编译时进行计算,而不是在运行时。这种技术最初在C++中通过模板元编程(Template Meta-programming)得到广泛的应用,使得C++不仅仅是一种面向对象...

    python中metaclass原理与用法详解

    在前面一篇文章《python动态创建类》里我们提到过,可以用如下的一个观点来理解什么是metaclass: MyClass = MetaClass() MyObject = MyClass() metaclass是python 里面的编程魔法 同时在前面一篇《python动态创建...

    举例讲解Python中metaclass元类的创建与使用

    ### Python中的Metaclass元类创建与使用详解 #### 一、引言 在Python中,元类(Metaclass)是一个非常强大的概念,它允许我们控制类的行为和特性。通过使用元类,我们可以自定义类的创建过程,实现更加灵活和高级的...

    Android源码——动态壁纸源码.zip

    这份“Android源码——动态壁纸源码.zip”压缩包很可能是包含了一个实现Android动态壁纸功能的源代码项目。下面将详细探讨Android动态壁纸的工作原理、相关API以及如何开发一个动态壁纸应用。 1. **动态壁纸工作...

    python-metaclass.py

    python-metaclass.py

    Python-动态创建一个模型的多个tablename并通过DjangoORM操作

    在Django中动态创建模型并设置不同表名,我们需要创建一个基类,然后通过继承该基类来创建不同的模型。这个基类可以包含一些公共的字段和方法,而子类则可以根据需求添加特定的字段。例如: ```python from django....

    meta-programming-in-elixir.epub

    meta-programming-in-elixir.epub

    qt通过类名动态创建对象

    在Qt框架中,动态创建对象是一项重要的编程技巧,它允许我们根据字符串形式的类名来实例化对应的对象。这样的功能在实现插件机制、运行时加载不同组件或处理未知类型对象时尤为有用。本篇文章将深入探讨如何在Qt中...

    深入Python的元宇宙:探索元类(Metaclass)的奥秘

    ### 深入Python的元宇宙:探索元类(Metaclass)的奥秘 #### Python 简介 Python 是一种流行的高级编程语言,由 Guido van Rossum 于 1989 年底发明,并于 1991 年发布了第一个公开发行版。Python 的设计哲学强调...

    诊断性meta分析手把教你做临床Meta分析——诊断试验性Meta-Disc分析.doc

    诊断性meta分析手把教你做临床Meta分析——诊断试验性Meta-Disc分析 诊断性meta分析是Meta分析的一个重要局部,准确诊断性Meta分析是临床治疗的根底。本篇文章将向大家推荐一款专用于诊断性试验的免费Meta分析软件...

    Python库 | metaclass-1.0-py2.py3-none-any.whl

    在本例中,我们关注的是一个名为"metaclass-1.0-py2.py3-none-any.whl"的Python库。这个库特别之处在于它与Python中的元类(metaclasses)有关,元类是Python面向对象编程中的一个高级概念。 元类是Python中创建类...

    两句话带你完全掌握Python最难知识点——元类!

    当你在类定义之前指定`metaclass`,Python就会使用指定的元类来创建类,而不是默认的`type`。元类可以修改类的定义,比如添加方法、改变属性行为或者实现特殊的初始化逻辑。 现在我们来详细展开这两个知识点: 1. ...

    Qt实例分析——QML创建新的Qt Quick类型

    在Qt框架中,QML(Qt Meta Language)是一种声明式语言,用于构建用户界面,而C++则提供了强大的后端编程能力。当我们需要在QML中实现特定功能或组件时,有时QML的标准库并不足以满足需求,这时就需要通过C++自定义...

    Ruby Meta Programming: define_method or class_eval

    在性能方面,`define_method`通常比`class_eval`更快,因为`define_method`可以直接解析符号并创建方法,而`class_eval`需要解析和执行代码块。这在大量使用元编程的场合可能会成为一个重要因素。 为了比较`define_...

    maven-metaclass-plugin-1.1-rc3.jar

    maven-metaclass-plugin-1.1-rc3.jar

    Python使用metaclass实现Singleton模式的方法

    在Python中,通常通过元类(metaclass)来实现Singleton模式。 元类是Python中的一个高级特性,它允许我们控制类的创建过程。元类是类的类,当我们定义一个类时,实际上是创建了一个特定元类的实例。Python的`type`...

    如何撰写高质量的流行病学研究论文第七讲随机对照试验Meta分析的报告规范——QUOROM介绍.pdf

    【标题解析】:“如何撰写高质量的流行病学研究论文第七讲随机对照试验Meta分析的报告规范——QUOROM介绍” 这篇文件的标题涉及到撰写高质量流行病学研究论文的一个关键环节,即随机对照试验(Randomized ...

    Meta Programming Ruby

    通过以上介绍可以看出,《Meta Programming Ruby》是一本非常适合希望深入理解Ruby元编程特性的开发者的书籍。无论是对于初学者还是经验丰富的程序员来说,都能够从中获得宝贵的见解和技术指导。

Global site tag (gtag.js) - Google Analytics