posts - 256, comments - 1319, trackbacks - 41, articles - 8
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

        前几天写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兄的批评!

Feedback

#1楼    回复  引用    

2005-08-31 12:31 by limodou [未注册用户]
这种用法并不是metaclass的东西。一个metaclass需要从type类派生,这样的类才是元类。

象你的例子中的类klass没有基类,它即不是元数也不是new style class ,而是classic class,也就是它只是最普通的类。所展示的内容也仅能算是Python的动态特性而已。

#2楼 [楼主]   回复  引用  查看    

2005-08-31 14:03 by FantasySoft      
To limodou: 谢谢您的指出Post中说得模棱两可的地方。

您说得很对,这里面并没有哪个东东是metaclass,但是class_with_method这个function为Class的创建提供了一个模板,其作用与metaclass的作用是很类似的。我会修改Post,将问题讲得更清楚一些。

modou兄,谢谢!

#3楼    回复  引用    

2006-12-11 14:47 by huangyi[匿名] [未注册用户]
"""
这种用法并不是metaclass的东西。一个metaclass需要从type类派生,这样的类才是元类。
"""

metaclass 并不需要从type类派生,任何接受三个参数(好像是三个吧)的callable对象都可以,type类只是metaclass的一个例子而已!

我也打算写点python metaclass的东西

#4楼    回复  引用    

2006-12-11 19:07 by huangyi[匿名] [未注册用户]
metaclass in python (part 1)
http://codeplayer.blogspot.com/2006/12/metaclass-in-python.html

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-08-31 14:25 编辑过
 
另存  打印