0%

Mosh的Python课程笔记(8)--Modules

Mosh的课程网址

1
2
3
4
5
6
7
# sales.py
def calc_tax():
pass


def calc_shipping():
pass
1
2
3
4
5
# app.py
from sales import calc_shipping, calc_tax

calc_shipping()
calc_tax()

或:

1
2
3
4
import sales

sales.calc_shipping()
sales.calc_tax()

Compiled Python Files

编译后在__pycache__生成 sales.cpython-39.pyc 文件,如果sales.py未作更改,则此文件直接用(相当于缓存),可以加快程序执行。如果sales.py改了,则要重新生成此文件。

Module Search Path

1
2
3
import sys

print(sys.path)
1
['e:\\Stone\\Python\\HelloWorld', 'D:\\Python39\\python39.zip', 'D:\\Python39\\DLLs', 'D:\\Python39\\lib', 'D:\\Python39', 'C:\\Users\\11405\\AppData\\Roaming\\Python\\Python39\\site-packages', 'D:\\Python39\\lib\\site-packages']

Packages

package 对应于文件夹;module 对应于文件

比如在 app.py 所在目录下有个 ecommerce 文件夹,ecommerce 文件夹内有多个文件,包括 sales.py,假如改文件夹内有文件__init__.py,则 python 会将此文件夹视为 package.

那么可以这样用:

1
2
3
4
5
# app.py
from ecommerce import sales

sales.calc_tax()
sales.calc_shipping()

Sub-packages

ecommerce 文件夹内有 shopping 文件夹, shopping 文件夹内有文件__init__.py 和 sales.py,则:

1
2
# app.py
from ecommerce.shopping import sales

Intra-package References

002

1
2
3
4
5
# sales.py
from ecommerce.customer import contact
from ..customer import contact # ..表示父目录

contact.contact_customer()

The dir() Function

1
2
3
4
# app.py
from ecommerce.shopping import sales

print(dir(sales))

输出sales的各种方法:

1
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'calc_shipping', 'calc_tax', 'contact']

比如:

1
2
3
4
5
6
# app.py
from ecommerce.shopping import sales

print(sales.__name__)
print(sales.__package__)
print(sales.__file__)

输出:

1
2
3
ecommerce.shopping.sales
ecommerce.shopping
e:\Stone\Python\HelloWorld\ecommerce\shopping\sales.py

Executing Modules as Scripts

1
2
3
4
5
6
7
8
9
10
# ecommerce/shopping/sales.py
print("Sales initialized", __name__)


def calc_tax():
pass


def calc_shipping():
pass
1
2
# ecommerce/__init__.py
print("Ecommerce initialized")
1
2
# app.py
from ecommerce.shopping import sales

执行 app.py,输出:

1
2
Ecommerce initialized
Sales initialized ecommerce.shopping.sales

如果执行sales.py, 输出:

1
Sales initialized __main__

可见__name__对于不同py文件是不同的。

如果加上:

1
2
if __name__ == "__main__":
# bla bla bla

则只在当前py文件运行时执行这些 # blablabla 的code。