15.模塊-包-庫 15.1 基本概念 隨著代碼量的不斷增多,一個文件里代碼會越來越長,也不容易維護。為瞭解決這種問題,我們會進行拆分,並將具備類似的功能放同一文件中。這樣每個文件包含的代碼就相對較少。在Python中一個.py文件就稱之為一個模塊,英文叫(module) 使用模塊的好處如下所示: ...
15.模塊-包-庫
15.1 基本概念
隨著代碼量的不斷增多,一個文件里代碼會越來越長,也不容易維護。為瞭解決這種問題,我們會進行拆分,並將具備類似的功能放同一文件中。這樣每個文件包含的代碼就相對較少。在Python中一個.py文件就稱之為一個模塊,英文叫(module)
使用模塊的好處如下所示:
- 1.提高了代碼的可維護性
- 2.提高了代碼的可復用性,當一個模塊編寫完成之後,可以被其他地方引用。
- 3.使用模塊還可以避免函數名稱、變數名和類名等命名衝突。相同名字的函數、變數名、類名等可以放在不同的模塊中,但要避免與內置函數名衝突
模塊雖然解決了函數名、變數名和類名等命名衝突,那模塊之前也會存在命名衝突的情況,應該怎麼解決?為解決這個模塊命名衝突,Python引入了按目錄來組織模塊的方法,稱為包,英文(package)
舉個例子,現在有兩個py文件,分別為surpassA.py和surpassB.py,則相應的模塊名即為surpassA和surpassB。如果這兩個模塊名與其他模塊名存在衝突,則可以包來組織模塊,使其成為包。方法是選擇一個頂層包名,如surpass,按以下形式進行存放
surpass
|—— __init__.py
|—— surpassA.py
|—— surpassB.py
在引入包之後,只要頂層的包名沒有衝突,則可以確保模塊名不會產生衝突。則相應的模塊名也由原來的模塊名變更為surpass.surpassA和surpass.surpassB。
1.包的註意事項:每個包目錄中必須存在__init__.py文件,否則Python會將視為普通目錄,而非一個包。
2.__init__.py文件內容可以為空,也可以有相應的代碼,其本身也是一個模塊
類似這種情況,在一個包裡面也是可以存在多個目錄,組成多層級的包,示例如下所示:
surpass
|—— __init__.py
|—— surpassA.py
|—— surpassB.py
|—— config
| |—— __init__.py
| |—— surpassC.py
| |—— surpassD.py
|—— web
|—— __init__.py
|—— surpassE.py
|—— surpassF.py
以示例對應的模塊名分別如下所示:
- surpassC:surpass.config.surpassC
- surpassA:surpass.surpassA
在Python中庫是具有相關功能模塊的集合,英文(library)。可分為以下三種形式:
- 標準庫:Python內置庫
- 自定義庫:自己所寫
- 第三方庫:由他人所寫或開源分享出來的
第三方庫的安裝,一般使用pip安裝,其形式如下所示:
pip/pip3 install -U 庫名
15.2 導入模塊
Python自身內置了很多模塊,只要安裝完成後,即可以正常調用。導入模塊的常見形式如下所示:
import 模塊名
import 模塊名 as 別名 # 在模塊名稱特別長的時候,可以簡化調用所輸入的模塊名
import 模塊名A,模塊名B,模塊名C,
from 模塊名 import 函數名/類名 # 導入指定模塊中的函數或類
from 模塊名 import * # 導入指定模塊中的所有內容,但排除以下劃線開頭的變數、函數等
引入某一特定路徑下的模塊,可使用sys.path.append(模塊名),示例如下所示:
import sys
# 表示將上一層路徑添加到sys.path中,在添加之後,解釋器會搜索當前模塊所在目錄以及sys.path指定的路徑去找需要import的模塊
sys.path.append("..")
導入模塊需要遵循的規則如下所示:
- 1.內置的模塊優先導入並靠前
- 2.導入模塊時,儘量少用from from 模塊名 import *
- 3.不要重覆導入同一模塊,Python針對多次導入的模塊,也僅執行一次
15.3 示例代碼
person.py
class Person:
def __init__(self,name,age):
self._name=name
self._age=age
def getPerInfo(self):
print(f"name is {self._name},age is {self._age}")
mulClass.py
class Student:
def __init__(self, name, age,classNo):
self._name = name
self._age = age
self._classNo=classNo
def getPerInfo(self):
print(f"name is {self._name},age is {self._age},class NO. is {self._classNo}")
class Worker:
def __init__(self,name,occupation):
self._name=name
self._occupation=occupation
def getWorkerInfo(self):
print(f"name is {self._name},he/she is {self._occupation}")
class Teacher():
def __init__(self,name,classNO):
self._name=name
self._classNo=classNO
def getClassNo(self):
print(f"teacher's name is {self._name},His/Her's class is {self._classNo}")
def testFunc(name):
print(f"Hello, {name}")
main.py
import person
from mulClass import Student
from mulClass import testFunc
if __name__ == '__main__':
person=person.Person("Surpass",28)
person.getPersonInfo()
student=Student("Surpass",18,"Class-1")
student.getStudentInfo()
testFunc("testFunc")
輸出結果如下所示:
name is Surpass,age is 28
name is Surpass,age is 18,class NO. is Class-1
Hello, testFunc
本文地址:https://www.cnblogs.com/surpassme/p/13020585.html
本文同步在微信訂閱號上發佈,如各位小伙伴們喜歡我的文章,也可以關註我的微信訂閱號:woaitest,或掃描下麵的二維碼添加關註: