在 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'
如果我在 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'