Python 在模块中使实例方法全局化?
我创建了一个可以导入并按原样使用的库,还有一个开始脚本,它创建了一个主类的实例,以便在脚本中使用:Python 在模块中使实例方法全局化?,python,Python,我创建了一个可以导入并按原样使用的库,还有一个开始脚本,它创建了一个主类的实例,以便在脚本中使用: # read config, init stuff, and then create an instance r = RepoClient(config) 现在,start脚本接受一个“command”参数,并且从现在起,它必须像以下那样被调用: repo config.json -c 'r.ls()' i、 e.必须使用“r”变量 我希望能够删除'r'变量。为此,start脚本需要ls函数
# read config, init stuff, and then create an instance
r = RepoClient(config)
现在,start脚本接受一个“command”参数,并且从现在起,它必须像以下那样被调用:
repo config.json -c 'r.ls()'
i、 e.必须使用“r”变量
我希望能够删除'r'变量。为此,start脚本需要ls
函数。创建r
实例后,我可以通过在脚本中放入以下内容来完成此操作:
ls = r.ls
RepoClient类支持的所有命令
有自动的吗?当然,下面的代码不起作用,但您可以理解:
from r import *
我能想到的是用一个自定义的@命令注释方法,迭代所有方法并检查它,如果找到,将其设置为全局脚本,但希望电池已经支持类似的东西;d
EDIT:目前,作为最后一个参数传递的命令按以下方式运行:
exec(sys.argv[2])
不,没有办法“自动”做到这一点。但是,实际上不需要将项复制到全局命名空间中。您可以将命名空间传递给exec
以使用。您可以给您的RepoClient
一个\uuuu getitem\uuuu
方法,允许它充当名称空间。下面是一个简单的例子:
class Foo(object):
def blah(self):
print("Blah!")
def __getitem__(self, attr):
return getattr(self, attr)
f = Foo()
exec('blah()', globals(), f)
它输出废话
为什么不:定义ls(*args,**kargs):返回r.ls(*args,**kargs)
?因为我必须编写所有代码。它与ls=r.ls
完全相同(至少我这么认为,我不是Python专业人士)。r
实例有许多类似于ls
的命令,我必须为每个命令执行这样的赋值。然后,如果我添加了一个新的命令/方法,我必须记住也要将它添加到脚本globals中-容易出错的东西,应该进行自动化。您真的需要传递给脚本的命令字符串与在模块名称空间中查找的名称相同吗?我认为您可以使其ls()
只在实例名称空间中查找名称,而不是将实例名称空间复制到模块名称空间中。@wujek啊,好的。我相信这是有帮助的,因为很难理解你想要实现什么,脱离上下文;我怀疑是安,这很好。我甚至可以在脚本中定义\uu getitem\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu方法,并通过Foo将其添加到Foo类中。