延迟加载类实例方法

时间:2015-04-11 17:52:28

标签: python

以下延迟加载代码似乎有效。除了缺乏内省之外,这种延迟加载方式是否存在隐患?

myprog.py

from myclass import myclass
mc = myclass()
mc.nosuchfunc()
mc.otherfunc()

myclass.py

class myclass(object):
    def __getattr__(self, name):
        exec('import ' + name)
        exec('self.' + name + ' = ' + name + '.' + name)
        return eval('self.' + name)

nosuchfunc.py

def nosuchfunc():
    print __name__

otherfunc.py

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

现在我需要弄清楚如何区分尝试访问函数类型以及尝试访问其他属性类型。

1 个答案:

答案 0 :(得分:0)

请勿使用execeval。它不是很清楚,会发生什么:

class myclass(object):
    def __getattr__(self, name):
        module = __import__(name)
        func = getattr(module, name)
        setattr(self, name, func)
        return func