当模块中遇到属性查找失败时,希望创建关联类的实例与模块并调用与失败属性同名的方法。然而,由于 xxx 方法的限制以及修改模块属性的限制,Python 并不直接支持这一点。
遇到的两个挑战是:
解决方案
要克服这些限制,解决方法是创建替换类的包装器实例并将其存储在 sys.modules 中以代替原始模块。这有效地将所有属性查找重定向到包装器实例,从而允许实现类似 getattr__ 的行为。然而,值得注意的是,与直接在模块上使用 __getattr 相比,这种方法可能会导致不同的行为,因为包装器每次都会创建一个新实例。
Guido van Rossum 的 Hack
Guido van Rossum 提出了一种替代方法,利用导入机制的余量用实例或类替换 sys.modules 中的模块。在此方法中,在模块中定义具有所需功能的类,并将其分配给 sys.modules[__name__] 作为模块的最终行为。这允许在模块本身上实现 getattr 和其他元编程功能。然而,重要的是要确保所有必要的功能都封装在替换类中,因为模块的其他元素将在 sys.modules 分配时丢失。
以上是如何在 Python 中为模块实现类似'getattr”的行为?的详细内容。更多信息请关注PHP中文网其他相关文章!