不久前,Guido宣布对新型类的所有特殊方法查找都绕过
__getattr__and
__getattribute__。Dunder方法曾经工作的模块-
你可以,例如,使用一个模块作为一个上下文管理器简单地通过定义
__enter__和
__exit__,这些技巧之前爆发。
最近,一些历史功能已经卷土重来,其中的一个模块已被卷土重来,
__getattr__因此,
sys.modules不再需要现有的hack(在导入时将一个模块替换为一个类)。
在Python
3.7+中,您仅使用一种显而易见的方法。要自定义模块上的属性访问,请
__getattr__在模块级别定义一个函数,该函数应接受一个参数(属性名称),然后返回计算值或引发一个
AttributeError:
# my_module.pydef __getattr__(name: str) -> Any: ...
这也将允许钩入“ from”导入,即,您可以为诸如的语句返回动态生成的对象
from my_module import whatever。
与此相关的是,您还可以与模块getattr一起
__dir__在模块级别定义一个函数以响应
dir(my_module)。有关详细信息,请参见PEP
562。



