1.什麼是python的包 包就是一個文件夾,裡面放著一個個py文件或子包; 在包中可以被調用的一個個py文件,我們叫做模塊; 如上,test就是一個包、two.py就是test下的一個模塊,child是子包,結構和test包一樣; 包的身份證 可以看到test下還有一個__init__.py命名的 ...
1.什麼是python的包
包就是一個文件夾,裡面放著一個個py文件或子包;
在包中可以被調用的一個個py文件,我們叫做模塊;
如上,test就是一個包、two.py就是test下的一個模塊,child是子包,結構和test包一樣;
包的身份證
可以看到test下還有一個__init__.py命名的文件,是python包中必須存在的文件,是和普通文件夾的區分標誌、類似包的身份證;
2.包的導入import
import package
一般用於兩種場景,拿到某包下__init__.py文件中中的功能或同級模塊下的功能;
如上結構,在three.py文件中可以通過import導入test/__init__.py中的方法;
# test/__init__.py
def test_init_func():
print('test_init_func')
# test2/three.py
import test
test.test_init_func() # test_init_func
還可以在three.py中導入同級模塊one.py中的功能;
# test2/one.py
def test2_one_func():
print('test2_one_func')
# test2/three.py
import one
one.test2_one_func() # test2_one_func
3.模塊的導入from .. import ..
通過某個包找到對應的模塊;from package import module
3.1 導入同級包中的某模塊
eg:在main.py中導入test/two.py模塊
# test/two.py
def test_two_fun():
print('test_two_func')
# main.py
# 方式一 仍然使用import
import test.two
test.two.test_two_fun() # test_two_func
# main.py
# 方式二 使用from...import...
from test import two
two.test_two_fun() # test_two_func
# main.py
# 也可以直接導入方法
from test.two import test_two_fun
test_two_fun() # test_two_func
此時要導入模塊中的類時,與方法的導入類似,導入後實例化一下即可;
# test/two.py
class Two(object):
@staticmethod
def test_two_fun():
print('test_two_func')
# main.py
from test import two
t = two.Two()
t.test_two_fun() # test_two_func
# 也可以直接導入類
from test.two import Two
t = Two()
t.test_two_fun() # test_two_func
# python的模塊導入形式比較靈活,按需使用即可
3.2 導入同級包中子包某模塊
eg: 在main.py中導入test/test2/one.py模塊中的方法;
# test/test2/one.py
def test_test2_one_func():
print('列印test_test2_one_func')
# main.py
from test.test2 import one
one.test_test2_one_func() # 列印test_test2_one_func
# main.py
# 也可以直接導入函數
from test.test2.one import test_test2_one_func
test_test2_one_func() # 列印test_test2_one_func
可以優化下上面from test.test2.one import 的寫法,在test/__init__.py中提前導入子包;
# test/__init__.py
from .test2.one import test_test2_one_func # init文件中導入同級子包中方法,需使用 .子包名 的方式
# main.py
# 此時可以直接用import方式導入,書寫上方便的多
import test
test.test_test2_one_func() # 列印test_test2_one_func
3.3 導入同級包中不同子包各自模塊
此時main.py中要同時導入兩個one.py模塊;
# test/test2/one.py
def test_test2_one_func():
print('列印test_test2_one_func')
# test/test3/one.py
def test_test3_one_func():
print('列印test_test3_one_func')
# main.py
from test.test2 import one as test2_one
from test.test3 import one as test3_one # 有模塊名重覆時,為了區分,可以使用as重命名下
test2_one.test_test2_one_func()
test3_one.test_test3_one_func()
'''
列印test_test2_one_func
列印test_test3_one_func
'''
同樣也可以藉助init文件,簡寫調用方式;
# test/__init__.py
from .test2.one import test_test2_one_func
from .test3.one import test_test3_one_func
# main.py
from test import test_test2_one_func, test_test3_one_func # 同一模塊導入多個方法時,可以合併到一行寫
test_test2_one_func()
test_test3_one_func()
'''
列印test_test2_one_func
列印test_test3_one_func
'''
總結