iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 17
0
Software Development

python 自學系列 第 17

python day17 (module、package)

  • 分享至 

  • xImage
  •  

module

由於上一篇有用到 module 今天就來看一下 module 是什麼,module 基本上就是一個檔案.而 module 名稱使用小寫,所以前一篇有自定義了一個 myCaculate 模組也就是 my_caculate.py 這檔案.而模組裡可以定義變數、function 或 class.
my_caculate.py

total_amt = 0

def add(a,b):
 return a + b

def _sum(a,b):
 return a + b

class CusCounter:
 def count(self,num):
  return num + 1

如果要使用 my_caculate 模組只需要 import 進來就可以使用 module 提供的屬性、類別和函式.

import my_caculate
>>> counter = my_caculate.CusCounter()
>>> counter.count(1)
2
>>> print(my_caculate.total_amt)
0
>>> my_caculate.add(2,3)
5
>>> my_caculate._sum(10,11)
21

module import 進來了但在使用時都要在前面加上 module name.所以可以用另一種方式 from ... import ....這樣就不用加上 module name 了.

>>> from my_caculate import *
>>> counter = CusCounter()
>>> counter.count(1)
2
>>> add(2,3)
5
>>> _sum(10,11)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name '_sum' is not defined

但 import * 之前有提過 _開頭的就不會被 import 進來了,要直接 import 該名稱.可是 my_caculate 之前已經 import 過了,如果想要區別的話可以使用 as 別名,取代原本的名稱.

>>> from my_caculate import _sum as my_sum
>>> my_sum(1,2)
3
>>> add(2,3)
5

package

module 是檔案,所以用來分類的 package 就是目錄了.把上面建立的my_caculate.py搬到一個目錄底下calc/util,為了告訴 python calc 是 package 要在 calc 目錄底下加上 __init__.py,裡面可以先不寫東西,但檔案一定要在.不然 python 會說 calc 不是 package.

calc
 __init__.py
 -util
  my_caculate.py

接著在 calc 同一層的目錄底下執行 python3,再把 calc.util package 底下的 my_caculate import 進來.

>>> from calc.util.my_caculate import *
>>> add(2,3)
5
PYTHONPATH

定義 PYTHONPATH 可以告訴 python 要去哪裡找 libraries.

> PYTHONPATH=/Volumes/Transcend/pylearn python3
Python 3.7.4 (v3.7.4:e09359112e, Jul  8 2019, 14:54:52)
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import calc.util.my_caculate
>>> counter = calc.util.my_caculate.CusCounter()
>>> counter.count(1)
2

使用 sys.path 可以看到所有會去找 library 的路徑.

>>> import sys
>>> sys.path
['', '/Volumes/Transcend/pylearn', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python37.zip', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages']

如果一開始沒給 PYTHONPATH 如果臨時想要增加 library 路徑的話,可以透過 sys.path.append 可以達到一樣的效果.

> python3
Python 3.7.4 (v3.7.4:e09359112e, Jul  8 2019, 14:54:52)
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import calc.util.my_caculate
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'calc'
>>> import sys
>>> sys.path.append('/Volumes/Transcend/pylearn')
>>> import calc.util.my_caculate
>>> counter = calc.util.my_caculate.CusCounter()
>>> counter.count(1)
2

如果想要知道使用 module 的實際路徑可透過__file__找到.

>>> calc.util.my_caculate.__file__
'/Volumes/Transcend/pylearn/calc/util/my_caculate.py'

但只限於在 python 實作的 library,像 sys 就沒辦法這樣使用.

>>> sys.__file__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'sys' has no attribute '__file__'

上一篇
python day16 (private、underscore)
下一篇
python day18 (Object Oriented Programming)
系列文
python 自學30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言