Skip to main content
 首页 » 编程设计

Python如何实现跨模块功能

2025年05月04日14Leo_wl

例如,我希望能够从导入的类中调用全局函数

在文件 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 根据相同的原则构建,那将是一场潜在的灾难两个独立的模块等)。但是,“显式优于隐式”,干净、安全、公开的通信会导致干净、安全、健壮的系统架构:我强烈建议您选择这条路线。