0

我正在尝试做的是创建一个带有类的模块;和一个函数,它是该类的接口;以及此函数中的动态变量名,它指向该类的实例。这个函数和类本身应该在一个单独的模块中,它们的用法应该在不同的python文件中。

我认为,当您查看我的代码时,更容易理解我想要做什么:

这是first.py

class FirstClass:
    def setID(self, _id):
        self.id = _id
    def func(self):
        pass

# An 'interface' for FirstClass
def fst(ID):
    globals()['%s' % ID] = FirstClass(ID)
    return globals()['%s' % ID]

现在,如果我直接调用fst('some_text')first.py结果几乎是我梦寐以求的,因为以后,任何时候我写some_text.func(),它都会调用func(),因为some_text它指向FirstClass.

但是,当second.py是这样的时候:

from first import fst

fst('sample_name')
sample_name.func()

那么python的答案将是这样的:

NameError: name 'sample_name' is not defined.

这有点合理..所以我的问题是:是否有“更漂亮”的方法或完全不同的方法来做到这一点?还是我必须在我的代码中更改一些小东西才能完成这项工作?

谢谢!

4

1 回答 1

2

不要在函数中将其设置为全局。相反,只需从函数返回新实例并将全局设置为该返回值:

def fst(ID):
    return FirstClass(ID)

然后在second.py

sample_name = fst('sample_name')

如果在函数内部,则声明sample_name一个global.

globals()方法只返回您调用它的模块的全局变量。它永远不会返回任何调用函数的全局变量。如果你觉得你需要访问这些全局变量,重新考虑你的代码,你很少,如果有的话,需要改变任何调用你的函数的全局变量。

如果您绝对确定需要访问调用者全局变量,则需要开始使用堆栈帧进行黑客攻击:

# retrieve caller globals
import sys
caller_globals = sys._getframe(1).f_globals

但是,作为sys._getframe()国家的文件:

CPython 实现细节:此函数应仅用于内部和专用目的。它不保证在 Python 的所有实现中都存在。

于 2013-03-25T10:08:47.530 回答