在模块中使实例方法全局化?

时间:2016-05-09 19:17:33

标签: python

我创建了一个可以导入并按原样使用的lib,还有一个启动脚本,它创建了一个主类的单个实例,供脚本使用:

# read config, init stuff, and then create an instance

r = RepoClient(config)

现在,start脚本接受一个'command'参数,截至目前,它必须调用如下:

repo config.json -c 'r.ls()'

即。必须使用'r'变量。

我希望能够删除'r'变量。为此,启动脚本不知何故需要ls函数。在创建r实例后,我可以通过在脚本中添加以下内容来完成此操作:

ls = r.ls

等。对于RepoClient类支持的所有命令。

有什么自动的吗?当然,下面的代码不起作用,但你明白了这个想法:

from r import *

我能想到的是使用自定义@command注释注释方法,迭代所有方法并检查它,如果找到,将其设置为脚本全局,但希望电池支持这样的事情已经; d

编辑:目前,作为最后一个参数传递的命令按以下方式运行:

exec(sys.argv[2])

1 个答案:

答案 0 :(得分:1)

不,没有办法做到这一点"自动"。但是,您实际上并不需要将项目复制到全局命名空间中。您可以将命名空间传递给exec以使用。您可以为RepoClient __getitem__方法提供方法,允许它充当命名空间。这是一个简单的例子:

class Foo(object):
    def blah(self):
        print("Blah!")

    def __getitem__(self, attr):
        return getattr(self, attr)

f = Foo()

exec('blah()', globals(), f)

输出Blah!