在 class 之外定义魔术方法有什么用?

What use is there for defining magic methods outside of a class?

如果我在 class 之外定义魔术方法会怎样?
例如,假设我愿意:

def __str__(stuff):
    return "chicken"

直接在模块内部。

这样的东西什么时候有用?我认为如果我 import 这个模块在别处命名为 module1 并尝试做 print(module1) 可能会有用,但这只会打印出文件位置和其他内容。

那么在 class 之外使用魔术方法有什么用吗?难道真的是什么神奇的方法了吗?

目前(Python3.9),可以定义两个模块级魔法方法:__getattr____dir__(详见PEP 562)。

  • __getattr__ 覆盖该模块的属性访问,包括 from x import y.
  • 形式的导入
  • __dir__ 覆盖 dir(module).
  • 返回的内容

例如:

# foo.py

def __getattr__(name):
    return name

def __dir__():
    return ['foo', 'bar']

那么我们可以通过以下方式使用它:

>>> import foo
>>> dir(foo)
['bar', 'foo']
>>> from foo import bar
>>> bar
'bar'