在.NET和JAVA语言中看到过嵌套类的实现,作为外部类一个局部工具还是很有用的,今天在python也看到了很不错支持一下。动态语言中很好的嵌套类的实现,应该说嵌套类解决设计问题同时简化了程序,值得学习。
#!/usr/bin/env python import threading, sys def 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 _1 def test(a, b): for i in xrange(100000): a = a+b return a if __name__ == '__main__': nested1 = nested1(2) nested2 = nested1(test) print nested2(2,3) a = nested2.child() print a
上面是一个借鉴web.py框架中的一个例子,下面print a部分是我的测试,发现函数对象不能引用内层的类,这里的实现可以发现比独立写多个函数和类减少很多代码
再看个例子:
#!/usr/bin/env python import os, sys class 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.name if __name__ == '__main__': child = parent.child() child.getName()
这里从父类引用内部类,后面部分还可以这样
if __name__ == '__main__': p = parent() p.getName() c = p.child() c.getName()