AttributeError: module A has no attribute B

AttributeError: module A has no attribute B

还有一个 python 导入问题。

我有一个目录结构

thing
  |- __init__.py
  |- run.py
  |- mod
      |- __init__.py
      |- what
           |- __init__.py
           |- yo.py

yo.py的内容是

class Yo:
    def __init__(self):
        print("initialized What")

而我的run.py的内容是

from mod.what import yo

y = yo.Yo
print(y)
y()

一切正常。

<class 'mod.what.yo.Yo'>
initialized What

但我需要这样导入:

from mod import what

y = what.yo.Yo
print(y)
y()

然后我得到

Traceback (most recent call last):
  File "/Users/pavelkomarov/Desktop/thing/run.py", line 4, in <module>
    y = what.yo.Yo
AttributeError: module 'mod.what' has no attribute 'yo'

为什么?我已经 __init__.pys 出来了。 python 不应该能够找到 class 吗?这个结构对我很重要,因为我在某个模块下有很多 classes,并且需要能够访问它们,最好是不必对每个模块进行更细粒度的导入,这需要大量代码.

感谢 Maurice 和其他线程的人员。

我找到了

import importlib
import pkgutil

for mod_info in pkgutil.walk_packages(__path__, __name__ + '.'):
    mod = importlib.import_module(mod_info.name)

    # Emulate `from mod import *`
    try:
        names = mod.__dict__['__all__']
    except KeyError:
        names = [k for k in mod.__dict__ if not k.startswith('_')]

mod 中的 __init__.py 就可以了。如果将它放在 what__init__.py.

中,它也会起作用

我不同意这是接近禅宗的任何东西,但它确实有效。