gpt4 book ai didi

python - 为什么有时我可以使用嵌套模块中的函数而无需导入整个路径?

转载 作者:行者123 更新时间:2023-12-02 09:41:41 24 4
gpt4 key购买 nike

我想知道这两种情况有什么区别?模块的内部结构是否有所不同?

那么为什么这个有效:

>>> import numpy
>>> numpy.random.RandomState
<class 'numpy.random.mtrand.RandomState'>

但是这个在我也导入嵌套模块之前不起作用:

>>> import tkinter
>>> tkinter.ttk.Spinbox
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'tkinter' has no attribute 'ttk'
>>> import tkinter.ttk
>>> tkinter.ttk.Spinbox
<class 'tkinter.ttk.Spinbox'>

我认为这一定与每个模块中的 __init__.py 文件有关,但具体的实现示例会很有帮助。

最佳答案

这种导入行为可以通过导入各个__init__.py文件中的深层类来实现。以下是项目结构的快速演示,其工作方式与真正的 numpy 和 tkinter 包几乎完全相同:

.
├── main.py
├── numpy
│   ├── __init__.py
│   └── random
│   ├── __init__.py
│   └── mtrand.py
└── tkinter
├── __init__.py
└── ttk.py

numpy/__init__.py:

from .random import RandomState

numpy/random/__init__.py:

from .mtrand import RandomState

numpy/random/mtrand.py:

class RandomState:
pass

tkinter/__init__.py:

tkinter/ttk.py:

class Spinbox:
pass

main.py:

import numpy
import tkinter

print(numpy.random.RandomState)

try:
print(tkinter.ttk.Spinbox)
except AttributeError as e:
print("Error:", e)
import tkinter.ttk
print(tkinter.ttk.Spinbox)

Output:

<class 'numpy.random.mtrand.RandomState'>
Error: module 'tkinter' has no attribute 'ttk'
<class 'tkinter.ttk.Spinbox'>

关于python - 为什么有时我可以使用嵌套模块中的函数而无需导入整个路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60303795/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com