例如,我希望能够从导入的类中调用全局函数
在文件 PetStore.py 中
class AnimalSound(object):
def __init__(self):
if 'makenoise' in globals():
self.makenoise = globals()['makenoise']
else:
self.makenoise = lambda: 'meow'
def __str__(self):
return self.makenoise()
然后当我在 Python 解释器中测试时
>>> def makenoise():
... return 'bark'
...
>>> from PetStore import AnimalSound
>>> sound = AnimalSound()
>>> sound.makenoise()
'meow'
我得到的是“喵”而不是“吠”。我尝试使用 python-how-to-make-a-cross-module-variable 中提供的解决方案没有运气。
请您参考如下方法:
globals() call 返回调用词法所在模块的全局变量; Python 中没有内在的“动态作用域”——它是词法作用域,就像几乎所有现代语言一样。
获得所需效果的可靠、正确的方法是显式传递给 AnimalSound 的初始化程序它应该用来“制造噪音”的可调用对象:即类应该是
class AnimalSound(object):
def __init__(self, makenoise=lambda: 'meow'):
self.makenoise = makenoise
def __str__(self):
return self.makenoise()
调用应该是
sound = AnimalSound(makenoise)
有可行但不太合理的解决方案,例如调用者传递自己的globals() (但这不必要地限制了可调用对象的名称!),甚至(不寒而栗)像其他答案倡导者一样通过隐蔽 channel 进行通信(如果你有两个实例 AnimalSound 根据相同的原则构建,那将是一场潜在的灾难两个独立的模块等)。但是,“显式优于隐式”,干净、安全、公开的通信会导致干净、安全、健壮的系统架构:我强烈建议您选择这条路线。
