首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AttributeError:模块A没有属性B

问AttributeError:模块A没有属性B
EN

Stack Overflow用户
提问于 2021-12-01 23:46:14
回答 1查看 718关注 0票数 0

还有一个巨蟒进口的问题。

我有一个目录结构

代码语言:javascript
复制
thing
  |- __init__.py
  |- run.py
  |- mod
      |- __init__.py
      |- what
           |- __init__.py
           |- yo.py

yo.py的内容如下

代码语言:javascript
复制
class Yo:
    def __init__(self):
        print("initialized What")

我的run.py的内容是

代码语言:javascript
复制
from mod.what import yo

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

一切都很好。

代码语言:javascript
复制
<class 'mod.what.yo.Yo'>
initialized What

但我需要这样进口:

代码语言:javascript
复制
from mod import what

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

然后我得到了

代码语言:javascript
复制
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__.py弄出去了。python不应该找到这个类吗?这个结构对我很重要,因为我在某个模块下面有很多类,需要能够访问所有类,最好不必对每个模块执行更多的粒度导入,这需要大量的代码。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-02 00:19:18

感谢莫里斯和另一条线上的人。

我发现

代码语言:javascript
复制
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's __init__.py里,它也会起作用。

我不同意,这是任何接近禅宗,但它的工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70192650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档