以下延迟加载代码似乎有效。除了缺乏内省之外,这种延迟加载方式是否存在隐患?
from myclass import myclass
mc = myclass()
mc.nosuchfunc()
mc.otherfunc()
class myclass(object):
def __getattr__(self, name):
exec('import ' + name)
exec('self.' + name + ' = ' + name + '.' + name)
return eval('self.' + name)
def nosuchfunc():
print __name__
def otherfunc():
print __name__
扩展Daniel的解决方案,支持在同一子目录中组织类模块文件及其方法模块文件:
class myclass(object):
def unsupportedfunc(self, *args):
print "unsupported method:", self._last__getattr__
def __getattr__(self, name):
self._last__getattr__ = name
try:
module = __import__(name, globals(), locals(), [], 1)
func = getattr(module, name)
setattr(self, name, func)
return func
except:
return self.unsupportedfunc
现在我需要弄清楚如何区分尝试访问函数类型以及尝试访问其他属性类型。
答案 0 :(得分:0)
请勿使用exec
或eval
。它不是很清楚,会发生什么:
class myclass(object):
def __getattr__(self, name):
module = __import__(name)
func = getattr(module, name)
setattr(self, name, func)
return func