搞懂Python包之后,感觉学Python轻松多了1.前言2.Python包3.包初始化4.Importing * From a Package5.子包( 三 )


pkg
├──sub_pkg1
│├──mod1.py
│└──mod2.py
└──sub_pkg2
├──mod3.py
└──mod4.py
四个模块(mod1.py,mod2.py,mod3.py和mod4.py)的定义如前所述 。 但是现在 , 它们不是被集中到pkg目录中 , 而是被分成两个子目录 , sub_pkg1和sub_pkg2 。
导入仍然和前面显示的一样工作 。 语法类似 , 但是额外的点符号用于分隔包名和子包名:
>>>importpkg.sub_pkg1.mod1
>>>pkg.sub_pkg1.mod1.foo()
[mod1]foo()
>>>frompkg.sub_pkg1importmod2
>>>mod2.bar()
[mod2]bar()
>>>frompkg.sub_pkg2.mod3importbaz
>>>baz()
[mod3]baz()
>>>frompkg.sub_pkg2.mod4importquxasgrault
>>>grault()
[mod4]qux()
此外 , 一个子包中的模块可以引用同级子包中的对象(如果同级子包包含你需要的某些功能) 。 例如 , 假设你想从mod3模块中导入并执行mod1中的函数foo() 。 你可以使用绝对导入:
pkg/sub_pkg2/mod3.py
defbaz():
print('[mod3]baz()')
classBaz:
pass
frompkg.sub_pkg1.mod1importfoo
foo()
>>>frompkg.sub_pkg2importmod3
[mod1]foo()
>>>mod3.foo()
[mod1]foo()
或者你可以使用相对导入 , 其中..指的是上一级的包 。 从mod3.py中引用的话也就是sub_pkg2这一层 。
..结果为父包(pkg),../sub_pkg1结果为子包sub_pkg1 。
pkg/sub_pkg2/mod3.py
defbaz():
print('[mod3]baz()')
classBaz:
pass
from..importsub_pkg1
print(sub_pkg1)
from..sub_pkg1.mod1importfoo
foo()
>>>frompkg.sub_pkg2importmod3
<module'pkg.sub_pkg1'(namespace)>
[mod1]foo()
【搞懂Python包之后,感觉学Python轻松多了1.前言2.Python包3.包初始化4.Importing * From a Package5.子包】
搞懂Python包之后,感觉学Python轻松多了1.前言2.Python包3.包初始化4.Importing * From a Package5.子包
文章图片