用metaclass來實現AOP

2022-02-07 13:49:12 字數 1292 閱讀 9011

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

ffor

attr, value 

indict.iteritems():

ifattr.startswith(

'set'):

dict[attr] 

=log(value)

return

super(metaall, mcl).__new__(mcl, name, bases, dict)

__metaclass__ 

=metaall

class

a:def __init__(self):

self.__x =1

def getx(self):

return

self.__x

def setx(self, value):

self.__x 

=valuea =

a()a.setx(2)

print a.getx()

看到那個__metaclass__變數了嗎?如果你賦給它另外乙個metaclass的話它會產生其他效應(我這裡做的是 logging,其他的可能有例如timing、access control、transaction, etc.),這是魔法!^_^ 最魔力十足的地方是我甚至可以把乙個metaclass傳進模組中去,給__metaclass__動態的賦值(賦metaclass),這意味著我可以通過meta-programming動態的改變我程式的邏輯,或者不需要改動原有**即可新增新功能(或修改)等特點!

整個演示就當作拋磚引玉吧,**我就不細講了,因為概念太複雜了,不是一兩句能說得明白的。有興趣的朋友可以研究一下python。; -)

AO中為什麼不能直接用類來例項化?

在ao開發中,經常會遇到類似的宣告 ibasicmap pmap new mapclass 於是就會產生這種疑問,為什麼不這樣宣告呢?mapclass pmap new mapclass 如果這樣宣告,將會編譯錯誤,不能通過類的全權名進行方法的呼叫,只能用介面例項來訪問。這是因為class 如上例中...

Houdini實現AO效果

ao ambient occlusion,環境吸收 或者 環境光吸收 什麼是occlusion?occlusion 就是提供了非常精確和平滑的陰影,就好像是全域性照明的結果。在你最終渲染後有多種方法來合成這些陰影會在真正意義上改善影象,它主要能改善陰影,給場景更多的深度,真正有助於更好的表現出模型的...

用屬性來實現封裝

用屬性來實現封裝 屬性是c 引入的一種語言成分,只有很少的語言支援屬性。通過對屬性的讀和寫來保護類中的域。第一種方法體身也是一種好的方式,但用屬性來實現封裝會更方便。現在我們來看乙個例子 using system public class department set public class de...