我想知道这两种情况有什么区别?模块的内部结构是否有所不同?
那么为什么这个可行:
>>> 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
文件中导入深度类来实现。这是一个项目结构的快速演示,该项目结构的工作原理与realnumpy
和tkinter
package完全一样:
.
├── __init__.py
├── 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
__init__.py
:
main.py
:
import numpy
import tkinter
print(numpy.random.RandomState)
try:
print(tkinter.ttk.Spinbox)
except AttributeError:
print("Caught an exception!")
import tkinter.ttk
print(tkinter.ttk.Spinbox)
输出:
<class 'numpy.random.mtrand.RandomState'> Caught an exception! <class 'tkinter.ttk.Spinbox'>
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句