惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
SegmentFault 最新的问题
爱范儿
爱范儿
博客园 - 三生石上(FineUI控件)
Microsoft Security Blog
Microsoft Security Blog
Google DeepMind News
Google DeepMind News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
GbyAI
GbyAI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V
V2EX
酷 壳 – CoolShell
酷 壳 – CoolShell
量子位
博客园_首页
T
Tailwind CSS Blog
aimingoo的专栏
aimingoo的专栏
A
About on SuperTechFans
T
The Blog of Author Tim Ferriss
Stack Overflow Blog
Stack Overflow Blog
Recent Announcements
Recent Announcements
P
Proofpoint News Feed
博客园 - 司徒正美
有赞技术团队
有赞技术团队
Engineering at Meta
Engineering at Meta
Last Week in AI
Last Week in AI
MongoDB | Blog
MongoDB | Blog

博客园 - yaksea

APScheduler: standalone vs daemonic 一句话解释jquery中offset、pageX, pageY、position、scrollTop, scrollLeft的区别 mongodb正则查询使用须知 PhoneGap源代码下载地址 python mysql 库的安装 windows环境下PYTHONPATH的设置 Eclipse+pydev2.2+python2.7 中文乱码问题 雷军:互联网创业的葵花宝典 什么是node.js 设置Django,在Eclipse+PyDev环境中开发Django应用 Python的模块、包等概念的理解 Python下划线与命名规范 Django如何进行数据访问查询 Django IDE 开发环境的搭建 在Eclipse下如何安装插件 使用Django如无到有11步快速构建Web应用 如何使用blog客户端 Apache如何添加虚拟目录 Zend Studio下的PHP代码调试
对python元类概念的理解
yaksea · 2011-08-31 · via 博客园 - yaksea

以下内摘自《Python 中的元类编

如果说类是对象实例的模板,那么元类就是类的模板,类的工厂

清单 1. 老式的 Python 1.5.2 类工厂

Python 1.5.2 (#0, Jun 27 1999, 11:23:01) [...]

Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam

>>> 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()

foo

工厂函数 class_with_method() 动态地创建一个类,并返回该类,这个类包含传递给该工厂的方法/函数。在返回该类之前,在函数体内操作类自身。 new 模块提供了更简洁的编码方式,但其中的选项与类工厂体内定制代码的选项不同,例如:

清单 2. new 模块中的类工厂

>>> from new import classobj

>>> Foo2 = classobj('Foo2',(Foo,),{'bar':lambda self:'bar'})

>>> Foo2().bar()

'bar'

>>> Foo2().say_foo()

foo

元类的魔力

清单 3. 作为类工厂元类的 type

>>> X = type('X',(),{'foo':lambda self:'foo'})

>>> X, X().foo()

(<class '__main__.X'>, 'foo')

清单 4. 作为类工厂的 type 后代

>>> class ChattyType(type):

...     def __new__(cls, name, bases, dct):

...         print "Allocating memory for class", name

...         return type.__new__(cls, name, bases, dct)

...     def __init__(cls, name, bases, dct):

...         print "Init'ing (configuring) class", name

...         super(ChattyType, cls).__init__(name, bases, dct)

...

>>> X = ChattyType('X',(),{'foo':lambda self:'foo'})

Allocating memory for class X

Init'ing (configuring) class X

>>> X, X().foo()

(<class '__main__.X'>, 'foo')

清单 5. 将类方法附加在所生成的类上

>>> class Printable(type):

...     def whoami(cls): print "I am a", cls.__name__

...

>>> Foo = Printable('Foo',(),{})

>>> Foo.whoami()

I am a Foo

>>> Printable.whoami()

Traceback (most recent call last):

TypeError:  unbound method whoami() [...]

 清单 6. 用类属性设置元类

>>> class Bar:

...     __metaclass__ = Printable

...     def foomethod(self): print 'foo'

...

>>> Bar.whoami()

I am a Bar

>>> Bar().foomethod()

foo

参考:

Python 中的元类编

Python 中的元类编程,第 2

Python 中的元类编程,第 3