在.NET和JAVA語言中看到過嵌套類的實現,作為外部類一個局部工具還是很有用的,今天在python也看到了很不錯支援一下。動態語言中很好的嵌套類的實現,應該說嵌套類解決設計問題同時簡化了程式,值得學習。
#!/usr/bin/env pythonimport threading, sysdef nested1(timeout): def _1(function): def _2(*args,**kw): class child(threading.Thread): def __init__(self): threading.Thread.__init__(self) self.result=None self.error = None self.setDaemon(True) self.start() def run(self): try: self.result = function(*args, **kw) except: self.error = sys.exc_info() c = child() c.join(timeout) if c.isAlive(): raise TimeoutError, 'took too long' if c.error: raise c.error[0], c.error[1] return c.result return _2 return _1def test(a, b): for i in xrange(100000): a = a+b return aif __name__ == '__main__': nested1 = nested1(2) nested2 = nested1(test) print nested2(2,3) a = nested2.child() print a
上面是一個借鑒web.py架構中的一個例子,下面print a部分是我的測試,發現函數對象不能引用內層的類,這裡的實現可以發現比獨立寫多個函數和類減少很多代碼
再看個例子:
#!/usr/bin/env pythonimport os, sysclass parent: def __init__(self): self.name = 'parent' def getName(self): print self.name class child: def __init__(self): self.name = 'child' def getName(self): print self.nameif __name__ == '__main__': child = parent.child() child.getName()
這裡從父類引用內部類,後面部分還可以這樣
if __name__ == '__main__': p = parent() p.getName() c = p.child() c.getName()