- 浏览: 118741 次
- 性别:
最近访客 更多访客>>
文章分类
最新评论
-
差沙:
应该有django的Model
metaclass in python (part 1) -
beyking:
哈哈,恭喜
老子毕业了 -
towjzhou:
晕死,这种符号能打出来吗?
新的 pep ! -
xlp223:
好,需要这样的例子。自己用只能是从文档中获取一些,高级的用法, ...
SQLAlchemy Examples -
xlp223:
sql是个基础,脱离它去谈orm,有如纸上谈兵。
强大的 sqlalchemy
python 的东西虽然概念上容易理解 ,但是实际用起来却也不都是那么容易的。这个 metaclass 就是典型一例。虽然早知道了它是什么,不过要说出它具体能干点啥,一时半会还真想不起来。
先看看官方文档中的定义吧:
__metaclass__ This variable can be any callable accepting arguments for
不好意思,真的不是我卖关子,实在是被第七条整晕了 = =",真不知道写这些代码的人是怎么想的,呵呵。
希望大家能从这些代码中看到 metaclass 的强大,动态语言的灵活。什么?还没看到?去看看这个去!
先看看官方文档中的定义吧:
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 了!
- 第一条[地址],是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 的过程要多了几个步骤,效率上可能就 ... ) - 第二条[地址],从这个例子的路径看它是在 python25/tools/ 下面,不过翻了一下自己python25 安装目录下却没有发现这些代码,郁闷!
在这个例子中,__metaclass__ 被当成了一种快捷定义 class 方法的方式了。
我们知道在 class 中定义的方法其实默认都是 instance 方法,要使它们成为 class 方法需要使用 classmethod 进行装饰,对于有大量 class 方法的类来说,这的确是有点小麻烦。
既然 class 中定义的方法是 class 的 instance 方法,那么在 type 中定义的方法岂不就是 type 的 instance 方法,也就正好是 class 方法了?
这个例子便是利用这一点,通过继承 type,添加 type 的 instance 方法,也就是添加了 class 方法了。好聪明啊,呵呵 ;-) - 第三条的用法与第一条类似,第四条[地址]来自传说中的 psyco !一看到这个名字差点没有勇气继续看下去了,不过还好,这个 metaclass 其实并不复杂,它的作用就是在 class 创建之后自动将它或 __psyco_bind__ 中指定的属性 bind 到 psyco,具体 bind 干了什么事情就只有对 psyco 有研究的兄弟来解答了,不过估计这样就可以进行某种特别的优化了。也许你要说了:这个工作也可以在 class 的 __init__ 或是 __new__ 方法里做啊。但是放在 __init__ 里面做的话你就需要其他的 class 都来继承你这个基类了,而使用 __new__ 的问题是它可以被子类 override 掉。
使用 metaclass 的另一个好处是,你可以神不知鬼不觉地修改 class 的创建过程,比如
这个例子里面,在模块中定义好 __metaclass__ 全局变量,那当其他的代码 from module import * 的时候,该 __metaclass__ 的定义就会自动作用于其后所定义的所有 class 了。 - 第五条和第八条的用法也和第一条类似,第六条貌似只是在使用 __metaclass__ 的情况下对 pickle 进行测试,没有什么特别的。至于第七条。。。。
不好意思,真的不是我卖关子,实在是被第七条整晕了 = =",真不知道写这些代码的人是怎么想的,呵呵。
希望大家能从这些代码中看到 metaclass 的强大,动态语言的灵活。什么?还没看到?去看看这个去!
发表评论
-
如何在醉酒的情况下编写正确的程序
2007-06-22 09:12 1307答案很简单:Test Driven。哈哈,这个(http:// ... -
Evolution of a Python programmer
2007-05-26 07:51 1379http://dis.4chan.org/read/prog/ ... -
Python and vim: Two great tastes that go great together
2007-05-26 08:29 1710Python and vim: Two great taste ... -
字典与动态语言
2007-03-19 10:18 1392字典(或者叫哈希表、关联数组..)与动态语言的渊源可谓极深。动 ... -
使用 python 模拟 ruby 的 open class
2007-01-27 11:42 1303老早就写了这些代码,但一直懒得为它写篇博客,我觉得我永远也无法 ... -
do it runtime
2007-01-20 11:19 2650第一次从静态语言到动态语言的人肯定在思维上需要 ... -
PLY: 一个以教学为目的的lex、yacc实现
2006-09-16 12:37 3846官方网站 想学或正在学编译原理的同学可不要错过了,要是上个学期 ... -
意外收获:get_caller
2006-09-16 14:01 1240阅读 PLY 的 lex.py 的时候 ... -
python is obvious !
2006-09-18 17:40 1361初识 python 的时候常常会被一些陌生的概念绊倒,而当熟悉 ... -
compatibility of IronPython
2006-09-19 03:58 1765IronPython 1.0 的发布,在邮件列表中引起了很多争 ... -
Be Pythonic
2006-10-19 03:05 1134Be PythonicWhat is PythonicPyth ... -
a python tutorial
2006-12-04 08:01 1491A Very Brief Introduction To Py ... -
metaclass in python (part 2)
2006-12-12 14:24 1801接着上一篇的讲。 现在我们知道了,metaclass 生 c ... -
python types and objects
2006-12-16 14:02 1337在探寻 metaclass 的过程 ... -
selfless python
2006-12-18 04:07 1093Eliminating self with Metaclass ... -
python virtual machines
2006-12-24 13:22 1488Jython,IronPython,PyPy。 ... -
理解 python 的 method 和 function 兼谈 descriptor
2007-01-01 07:34 4970总是看到有人对 python 中的 method 和 func ... -
写了个方便下载 tudou 网视频的小程序
2007-01-09 12:26 1758http://huangyilib.googlecode.co ... -
Build extensible application with egg
2007-01-17 02:49 1783在 python 社区中 egg 已经 ...
相关推荐
本文实例讲述了python中metaclass原理与用法。分享给大家供大家参考,具体如下: 什么是 metaclass. metaclass (元类)就是用来创建类的类。在前面一篇文章《python动态创建类》里我们提到过,可以用如下的一个观点来...
python-metaclass.py
Meta learning using one-shot learning, MAML, Reptile, and Meta-SGD with TensorFlow
### 深入Python的元宇宙:探索元类(Metaclass)的奥秘 #### Python 简介 Python 是一种流行的高级编程语言,由 Guido van Rossum 于 1989 年底发明,并于 1991 年发布了第一个公开发行版。Python 的设计哲学强调...
在本例中,我们关注的是一个名为"metaclass-1.0-py2.py3-none-any.whl"的Python库。这个库特别之处在于它与Python中的元类(metaclasses)有关,元类是Python面向对象编程中的一个高级概念。 元类是Python中创建类...
本文实例讲述了Python使用metaclass实现Singleton模式的方法。分享给大家供大家参考。具体实现方法如下: class Singleton(type): def __call__(cls, *args, **kwargs): print "Singleton call" if not hasattr...
1. **元类兼容**:`six.add_metaclass()`允许在Python 2和Python 3中创建元类,无需关心版本差异。 2. **迭代器兼容**:`six.iter*`系列函数(如`iterkeys()`, `itervalues()`, `iteritems()`)提供了Python 2和...
### Python中的Metaclass元类创建与使用详解 #### 一、引言 在Python中,元类(Metaclass)是一个非常强大的概念,它允许我们控制类的行为和特性。通过使用元类,我们可以自定义类的创建过程,实现更加灵活和高级的...
### 详解Python单例模式与Metaclass #### 单例模式概述 单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式在某些情况下非常有用,比如当应用程序需要控制资源访问时...
提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解。他知道这肯定和自省有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理解,以及在什么情况下...
Python-Metar Python-metar是一个Python软件包,用于解释METAR和SPECI编码的天气报告。 METAR和SPECI是编码的航空天气报告。 官方编码方案在世界气象组织(WMO)编码手册A卷(I.1卷)(WMO-306 IiA)中进行了规定...
Python中的元类(Metaclass)是一个高级特性,用于控制类的创建过程。元类是创建类的对象的类,也就是说,当我们定义一个类时,实际上是在创建一个特定类型的对象,而这个对象的类型就是由元类决定的。元类提供了一...
资源分类:Python库 所属语言:Python 资源全名:meta_ml-0.0.16-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
The deep dive internal logic of meta data micro service in edgex foundry, part 1.
Python中的元类(Metaclass)** 元类是用于创建类的类,它允许开发者自定义类的行为。虽然不是日常编程中经常使用的特性,但在某些复杂场景如ORM框架中却非常有用。元类使得Python具有高度的灵活性,可以定制类的...
### Python 中 Meta Classes详解 #### 元类概览与起源 元类,或者说是Meta Classes,在Python编程领域中扮演着非常特殊的角色。它们是类的类,或者说是一种用来定义类本身的类。理解元类的前提是对Python中的类有...