`
huangyiiiiii
  • 浏览: 118741 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

metaclass in python (part 1)

阅读更多
python 的东西虽然概念上容易理解 ,但是实际用起来却也不都是那么容易的。这个 metaclass 就是典型一例。虽然早知道了它是什么,不过要说出它具体能干点啥,一时半会还真想不起来。
先看看官方文档中的定义吧:
__metaclass__
This variable can be any callable accepting arguments for name, bases, and dict. Upon class creation, the callable is used instead of the built-in type(). New in version 2.2.

The appropriate metaclass is determined by the following precedence rules:

  • If dict['__metaclass__'] exists, it is used.
  • Otherwise, if there is at least one base class, its metaclass is used (this looks for a __class__ attribute first and if not found, uses its type).
  • Otherwise, if a global variable named __metaclass__ exists, it is used.
  • Otherwise, the old-style, classic metaclass (types.ClassType) is used.

The potential uses for metaclasses are boundless. Some ideas that have been explored including logging, interface checking, automatic delegation, automatic property creation, proxies, frameworks, and automatic resource locking/synchronization.

看完这个似乎又能理清了一点东西:所谓 new-style class 和 old-style class 最根本的区别其实正在于它们的 metaclass 一个是 type,一个是 types.ClassType,所以只要一个 class 继承自 object 而又没有指定自己的 __metaclass__ 的话,其 metaclass 就会自动使用基类 object 的 __metaclass__,但是 object 却没有 __metaclass__,那就使用 type(object),也就是 type 了!

然后再 google 一下(这次是要 google code 一下了),看看实际生活中的代码都用它来干了点啥。不搜不知道,这一搜还真发现不少有意思的结果:
  1. 第一条[地址],是twisted里的代码
    __metaclass__ = type
    真有创意!根据上面定义中 __metaclass__ 查找顺序,在使用 old-style class 的 metaclass (也就是types.ClassType)之前会找一下全局变量 __metaclass__ ,而上面代码中通过定义模块全局变量 __metaclass__ ,使得模块中原来的 old-style class 立刻变成了 new-style class。使用这种方法来将 old-style class 升级为 new-style class,确实省了不少代码,毕竟将来的 python 中将会只存在 new-style class ,那时候便可放心地将这一句去掉了。聪明!(不过这样会导致查找 metaclass 的过程要多了几个步骤,效率上可能就 ... )
  2. 第二条[地址],从这个例子的路径看它是在 python25/tools/ 下面,不过翻了一下自己python25 安装目录下却没有发现这些代码,郁闷!
    在这个例子中,__metaclass__ 被当成了一种快捷定义 class 方法的方式了。
    我们知道在 class 中定义的方法其实默认都是 instance 方法,要使它们成为 class 方法需要使用 classmethod 进行装饰,对于有大量 class 方法的类来说,这的确是有点小麻烦。
    既然 class 中定义的方法是 class 的 instance 方法,那么在 type 中定义的方法岂不就是 type 的 instance 方法,也就正好是 class 方法了?
    这个例子便是利用这一点,通过继承 type,添加 type 的 instance 方法,也就是添加了 class 方法了。好聪明啊,呵呵 ;-)
  3. 第三条的用法与第一条类似,第四条[地址]来自传说中的 psyco !一看到这个名字差点没有勇气继续看下去了,不过还好,这个 metaclass 其实并不复杂,它的作用就是在 class 创建之后自动将它或 __psyco_bind__ 中指定的属性 bind 到 psyco,具体 bind 干了什么事情就只有对 psyco 有研究的兄弟来解答了,不过估计这样就可以进行某种特别的优化了。也许你要说了:这个工作也可以在 class 的 __init__ 或是 __new__ 方法里做啊。但是放在 __init__ 里面做的话你就需要其他的 class 都来继承你这个基类了,而使用 __new__ 的问题是它可以被子类 override 掉。
    使用 metaclass 的另一个好处是,你可以神不知鬼不觉地修改 class 的创建过程,比如
    这个例子里面,在模块中定义好 __metaclass__ 全局变量,那当其他的代码 from module import * 的时候,该 __metaclass__ 的定义就会自动作用于其后所定义的所有 class 了。
  4. 第五条和第八条的用法也和第一条类似,第六条貌似只是在使用 __metaclass__ 的情况下对 pickle 进行测试,没有什么特别的。至于第七条。。。。
而至于第七(来自zope)和第九(来自sqlobject)两条,还是听下回分解吧。

不好意思,真的不是我卖关子,实在是被第七条整晕了 = =",真不知道写这些代码的人是怎么想的,呵呵。
希望大家能从这些代码中看到 metaclass 的强大,动态语言的灵活。什么?还没看到?去看看这个去!
分享到:
评论
1 楼 差沙 2008-01-31  
应该有django的Model

相关推荐

    python中metaclass原理与用法详解

    本文实例讲述了python中metaclass原理与用法。分享给大家供大家参考,具体如下: 什么是 metaclass. metaclass (元类)就是用来创建类的类。在前面一篇文章《python动态创建类》里我们提到过,可以用如下的一个观点来...

    python-metaclass.py

    python-metaclass.py

    Hands-On Meta Learning with Python.epub

    Meta learning using one-shot learning, MAML, Reptile, and Meta-SGD with TensorFlow

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

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

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

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

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

    本文实例讲述了Python使用metaclass实现Singleton模式的方法。分享给大家供大家参考。具体实现方法如下: class Singleton(type): def __call__(cls, *args, **kwargs): print "Singleton call" if not hasattr...

    python six 包

    1. **元类兼容**:`six.add_metaclass()`允许在Python 2和Python 3中创建元类,无需关心版本差异。 2. **迭代器兼容**:`six.iter*`系列函数(如`iterkeys()`, `itervalues()`, `iteritems()`)提供了Python 2和...

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

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

    详解python单例模式与metaclass

    ### 详解Python单例模式与Metaclass #### 单例模式概述 单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式在某些情况下非常有用,比如当应用程序需要控制资源访问时...

    深入理解Python中的元类(metaclass)

    提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解。他知道这肯定和自省有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理解,以及在什么情况下...

    python-metar:解析已编码METAR天气报告的python包

    Python-Metar Python-metar是一个Python软件包,用于解释METAR和SPECI编码的天气报告。 METAR和SPECI是编码的航空天气报告。 官方编码方案在世界气象组织(WMO)编码手册A卷(I.1卷)(WMO-306 IiA)中进行了规定...

    Python探索之Metaclass初步了解

    Python中的元类(Metaclass)是一个高级特性,用于控制类的创建过程。元类是创建类的对象的类,也就是说,当我们定义一个类时,实际上是在创建一个特定类型的对象,而这个对象的类型就是由元类决定的。元类提供了一...

    Python库 | meta_ml-0.0.16-py3-none-any.whl

    资源分类:Python库 所属语言:Python 资源全名:meta_ml-0.0.16-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    EdgeX meta data microservice part 1

    The deep dive internal logic of meta data micro service in edgex foundry, part 1.

    python面试题

    Python中的元类(Metaclass)** 元类是用于创建类的类,它允许开发者自定义类的行为。虽然不是日常编程中经常使用的特性,但在某些复杂场景如ORM框架中却非常有用。元类使得Python具有高度的灵活性,可以定制类的...

    Python 中 Meta Classes详解

    ### Python 中 Meta Classes详解 #### 元类概览与起源 元类,或者说是Meta Classes,在Python编程领域中扮演着非常特殊的角色。它们是类的类,或者说是一种用来定义类本身的类。理解元类的前提是对Python中的类有...

Global site tag (gtag.js) - Google Analytics