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

推荐订阅源

S
Secure Thoughts
S
Securelist
P
Proofpoint News Feed
D
DataBreaches.Net
Cisco Talos Blog
Cisco Talos Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
Project Zero
Project Zero
A
About on SuperTechFans
罗磊的独立博客
WordPress大学
WordPress大学
月光博客
月光博客
Latest news
Latest news
C
Cyber Attacks, Cyber Crime and Cyber Security
GbyAI
GbyAI
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
博客园 - 三生石上(FineUI控件)
F
Fortinet All Blogs
W
WeLiveSecurity
Attack and Defense Labs
Attack and Defense Labs
V
Visual Studio Blog
Blog — PlanetScale
Blog — PlanetScale
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
P
Privacy International News Feed
AI
AI
博客园 - 司徒正美
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Stack Overflow Blog
Stack Overflow Blog
M
MIT News - Artificial intelligence
Help Net Security
Help Net Security
T
Tor Project blog
V
Vulnerabilities – Threatpost
C
Cisco Blogs
I
Intezer
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
MyScale Blog
MyScale Blog
雷峰网
雷峰网
MongoDB | Blog
MongoDB | Blog
Forbes - Security
Forbes - Security
V
V2EX
Apple Machine Learning Research
Apple Machine Learning Research
T
Threat Research - Cisco Blogs
B
Blog RSS Feed
博客园 - 叶小钗
N
News and Events Feed by Topic
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Simon Willison's Weblog
Simon Willison's Weblog
C
CERT Recently Published Vulnerability Notes
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
N
News and Events Feed by Topic

博客园 - Cavingdeep

用metaclass实现AOP风格的Profiler Singleton implementation using metaclass 初试IronPython与.NET的集成 Refactoring as a way to improve the existing design 不该用Generics实现Abstract Factory的理由 新兴XML处理方法VTD-XML介绍 Performance Tips I DCG 2.0.72 (Beta1) 发布了 NUnit发布2.2.3兼容.NET 2.0 RTM 如果你想拥有一个可嵌入式模板引擎…… 改进ASP语法打造更高效的模板语言II 改进ASP语法打造更高效的模板语言 XML的特征以及一些用途 Release of DbHelper 1.2.1 深入XML系列技术 DbHelper at Tigris SQLite系列 集合的初始容量与性能 DbHelper basic usage
用metaclass来实现AOP
Cavingdeep · 2006-04-28 · via 博客园 - Cavingdeep

meta-programming是AOP实现的经常性手段,而这里要展示的,是利用Python的metaclass能力来实现 AOP。

当a的setx方法被调用时,会被“拦截”,先输出pre...然后是原始setx的方法调用,最后输出post...

class MetaAll(type):
   def __new__(mcl, name, bases, dict):
      def log(func):
         def f(
*args, **kwds):
            print 
'pre %s' % func.__name__
            value 
= func(*args, **kwds)
            print 
'post %s' % func.__name__
            
return value
         
return f
      
for attr, value in dict.iteritems():
         
if attr.startswith('set'):
            dict[attr] 
= log(value)
      
return super(MetaAll, mcl).__new__(mcl, name, bases, dict)

__metaclass__ 

= MetaAllclass A:
   def __init__(self):
      self.__x 
= 1

   def getx(self):

return self.__x

   def setx(self, value):
      self.__x 

= value

= A()
a.setx(
2)
print a.getx()

看到那个__metaclass__变量了吗?如果你赋给它另外一个metaclass的话它会产生其他效应(我这里做的是 logging,其他的可能有例如timing、access control、transaction, etc.),这是魔法!^_^ 最魔力十足的地方是我甚至可以把一个metaclass传进模块中去,给__metaclass__动态的赋值(赋metaclass),这意味着我可以通过meta-programming动态的改变我程序的逻辑,或者不需要改动原有代码即可添加新功能(或修改)等特点!

整个演示就当作抛砖引玉吧,代码我就不细讲了,因为概念太复杂了,不是一两句能说得明白的。有兴趣的朋友可以研究一下Python。; -)