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

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

那么为什么这个可行:

>>> 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文件中导入深度类来实现这是一个项目结构的快速演示,该项目结构的工作原理与realnumpytkinterpackage完全一样

.
├── __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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我已使用pip和conda安装的模块无法在Sublime或Atom中导入,但可以使用Jupyter Notebook(有时甚至是Terminal)导入。

我想知道为什么 add_execuable 有时可以使用与项目名称不同的名称,有时不能

在R包中包含Python函数,而无需在每次使用该函数时都导入整个包

为什么有时我的 ES 模块函数未定义

角度5:我可以导航到模块的路由,而无需在URL中包括模块的路径段?

我可以使用函数在python中导入模块吗

为什么Python模块有时不导入其子模块?

为什么我的Azure PowerShell任务脚本可以使用查找模块找到模块,而不能使用导入模块找到模块?

为什么有时可以使用NodeJS缓冲区连接音频数据,而有时却不能呢?

导入整个模块或导入某个函数有什么区别?

为什么有时我使用| 有时|| 在MATLAB中用于“或”?

我如何才能获得嵌套字典并找到值的中位数而无需导入任何模块?

在htop的命令列中,有时显示完整路径,有时则不显示。为什么?

为什么有时我必须在rsync路径中加倍转义空间?

在R中:为什么没有函数可以使用的每个参数的完整列表?

使用不同的计算机时,从位于不同目录中的文件导入函数,而无需更改路径

可以使用inotify监视要创建的特定文件,而无需监视整个目录吗?

为什么PyCharm无法自动完成turtle.mainloop()函数?如何知道可以使用模块中的哪个功能?

是否可以导出/要求使用Node.js中的模块,而无需使用var持有其对象的模块?

为什么我的 Lambda 函数有时只写入我的 DynamoDB 表?

如何初始化整个 Python 模块并导入所有类,而无需为每次调用引用模块名称?

为什么在我们可以使用简单的 return 语句时使用了函数表达式

为什么有时不使用原始字符串就可以使用Python正则表达式字符串?

有什么方法可以使用html.Parse而无需添加节点来制作“格式正确的树”?

为什么在可以使用 === 时使用 !==?

为什么有时我可以单击最大化窗口的边缘?

为什么有时我可以通过引理而不是直接证明目标?

为什么在其他模块中可以使用主模块的服务?

是否可以从vue.js中任意嵌套的子组件中更改属性,而无需在整个层次结构中拥有一系列事件?