python 創建模塊 筆記


在python中,模塊只是一個由python語句組成的文件。在模塊中可以定義函數和類,還可以包含簡單的可執行代碼

模塊可以包含說膽如何使用模塊代碼的文檔

模塊 只是一個python源文件。它可以包含變量、類、函數和python腳本中可用到的其他任何元素。

通過使用dir函數可以更好地理解模塊。給dir函數傳遞某個python元素的名稱,它將列出該元素的所有屬性。

1 導入模塊

 在使用一個模塊之前,需要先導入它:

import module

from module import item 僅導入所需要的一個類或函數

可以使用imp.reload函數重新加載模塊的新定義

import module

import imp

imp.reload(module) 需要使用賀括號

2 查找模塊

對於一個模塊,python解釋器首先查找一個稱為module.py的文件,其中module是傳遞給import語句 模塊的名稱。當找到該模塊時,python解釋器將它編譯成一個.pyc文件。當再次導入模塊時,python解釋器可以加載編譯好的模塊,加速python腳本的運行。

在腳本中編寫了一個import語句時,python解釋器必須能夠找到該模塊。關鍵的問題是,python解釋器只查找一定數量的目錄。如果python解釋器不能找到,將顯示一個錯誤。

sys模塊的sys.path變量中 列出搜索目錄

 3 創建模塊和包

一個python文件就是一個模塊 添加一個food.py文件

def favoriteFood():
print("the only food worth eating is an omelet.")

>>> import food
>>> dir(food)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'favoriteFood']
>>> food.favoriteFood()
the only food worth eating is an omelet.
>>> from food import favoriteFood
>>> favoriteFood()
the only food worth eating is an omelet.
4 面向對象編程

封裝: 一個類能夠隱藏執行某個任務所需的內部細節和數據。是一種簡化程序的技術。隱藏了復雜性。

繼承:一個類可以繼承或訪問父類中定義的數據和方法。可以在基類中編寫通用的代碼,在子類中編寫具體的代碼

多態:子類可以重寫方法來完成更特殊的行為

定義異常類:如果標准的異常類合適要使用標准的異常類,如果不合適,需要針對使用模塊時可能發生的特定問題定義異常

5 導入 

from module_name import *  從模塊導入所有的公有項

星號 告訴python解釋器導入模塊的全部公有方法。

如果 模塊中定義了變量__all__,解釋器使用__all__確定哪些項是公有項

如果模塊中沒有定義變量__all__,解釋器導入除了名稱以下划線開頭的項目之外的所有項

總是應訪在模塊中定義__all__ 這樣可以顯式控制其他python腳本可以導入的項。

總是應該明確地定義希望從模塊中導出什么。也應該總是為模塊建立文檔。

6 為模塊建立文檔

對於要寫入文檔的每一項,都要寫一個文檔字符串來描述這一項。在三引號內包含這個文檔字符串,並將它放到項的后面,緊挨着它要描述的項

即使類中沒有加入新的功能,也應該描述每個異常或類的用途。

在def 函數():后面使用三引號定義文檔

在claa 類名:后面使用三引號定義文檔

模塊文檔:在模塊開始位置使用三引號文檔字符串,放包含模塊的文本文件的第一行。

文檔內容:如何調用函數或方法,包括必要的參數和將要返回的數據類型。描述默認的參數值。

  給定類的設計目的和用途。包括如何使用類的對象。

  調用函數或方法的必備條件

  類的運行帶來的副作用或者導致系統的哪些方面發生變化。

  可能發生的異常和導致異常發生的原因。

使用help(meal)查看模塊的文檔

>>> import food

>>> help(food)
Help on module food:

NAME
food

FUNCTIONS
favoriteFood()

FILE
e:\pythonscript\food.py

在調用help函數讀入模塊的文檔之前,必須導入模塊。

''' test doc
dddddd2
dddddd3'''
'''dddd4'''
def favoriteFood():
print("the only food worth eating is an omelet.")

>>> imp.reload(food)

>>> help(food)
Help on module food:

NAME
food

DESCRIPTION
test doc
dddddd2
dddddd3

FUNCTIONS
favoriteFood()

FILE
e:\pythonscript\food.py

7 測試模塊

任何負責的模塊都應該包含執行模塊功能的測試函數。測試應該創建模塊中定義的類的實例,並調用這些實例的方法。

將測試函數集成到模塊中,這樣測試將一直可用。

8 將模塊作為程序運行

 將python模塊作為一個腳本運行:

if __name__=='__main__':

  test()

 

""" module for making meals in python.
import this module and then call makeBreakfast(),makeDinner() or makeLunch()."""
__all__=["Meal","AngrychefException","makeBreakfast","makeLunch","makeDinner","Breakfast","Lunch","Dinner"]
#Helper functions.
def makeBreakfast():
'''Creates a Breakfast object.'''
return Breakfast()
def makeLunch():
'''creates a Lunch object.'''
return Lunch()
def makeDinner():
'''Creates a Dinner object .'''
return Dinner()
# Exception classes.
class SensitiveArtistException(Exception):
'''Exception raised by an overly-sensitive artist.
base class for artistic types.'''
pass
class AngryChefException(SensitiveArtistException):
'''Exception that indicates the chef is unhappy.'''
pass
class Meal:
'''Holds the food and drink used in a meal.
in true object-oriented tradition,this class includes setter methods for the food and dring.

call printId to pretty-print the values.'''
def __init__(self,food='omelet',drink='coffee'):
'''Initialize to default values.'''
self.name='generic meal'
self.food=food
self.drink=drink
def printIt(self,prefix=''):
'''print the data nicely.'''
print(prefix,' a fine ',self.name,' with ',self.food,' and ',self.drink)
#setter for the food
def setFood(self,food='omelet'):
self.food=food
#setter for drink
def setDrink(self,drink='coffee'):
self.drink=drink
#setter for the name.
def setName(self,name=''):
self.name=name
class Breakfast(Meal):
'''holds the food and drink for breakfast.'''
def __init__(self):
'''initialize with an omelet and coffee.'''
Meal.__init__(self,'omelet','coffee')
self.setName('breakfast')
class Lunch(Meal):
''' holds the food and drink for lunch'''
def __init__(self):
'''Initialize with a sandwich and a gin and tonic.'''
Meal.__init__(self,'sandwich','gin and tonic')
self.setName('midday meal')
#override setFood().
def setFood(self,food='sandwich'):
if food!='sandwich' and food !='omelet':
raise AngryChefException
Meal.setFood(self,food)
class Dinner(Meal):
'''holds the food and drink for dinner.'''
def __init__(self):
'''initialize with steak and merlot.'''
Meal.__init__(self,'steak','merlot')
self.setName('dinner')
def printIt(self,prefix=''):
'''print even more micely.'''
print(prefix,' a gourmet ',self.name,' with ',self.food,' and ',self.drink)

def test():
'''test function.'''
print('module meal test')
#generic no arguments.
print('testing meal class.')
m=Meal()
m.printIt("\t")
m=Meal('green eggs and ham ','tea')
m.printIt("\t")
#test breakfast
print('testing breakfast class.')
b=Breakfast()
b.printIt("\t")
b.setName('breaking of the fast')
b.printIt("\t")
#test dinner
print('testing dinner class.')
d=Dinner()
d.printIt("\t")
#test lunch
print('testing lunch class.')
l=Lunch()
l.printIt("\t")
print('Calling lunch.setFood().')
try:
l.setFood('hotdog')
except AngryChefException:
print("\t","the chef is angry,pick an omelet.")
# run test if this module is run as a program.
if __name__=='__main__':
test()

meal模塊包含測試、文檔、異常、類、函數

>>> import meal
>>> breakfast=meal.makeBreakfast()
>>> breakfast.printIt("\t")
a fine breakfast with omelet and coffee
>>> lunch=meal.makeLunch()
>>> try:
lunch.setFood('pancakes')
except meal.AngryChefException:
print("cannot make a lunch of pancakes")


cannot make a lunch of pancakes

>>> from meal import *
>>> dinner=makeDinner()
>>> dinner.printIt()
a gourmet dinner with steak and merlot

9 安裝模塊

python解釋器在sys.path變量中列出的目錄中查找模塊。sys.path變量包括當前目錄,所以總是可以使用當前路徑中的模塊。如果希望在多個腳本或者多個系統中使用您編寫的模塊,需要將它安裝到sys.path變量列出的某個目錄下。

大多數情況下,需要將python模塊放到site-packages目錄中。

1 添加setup.py 文件:

from distutils.core import setup

setup(name='meal',
version='1.0',
py_modules=['meal'],
)

2 將setup.py /meal.py文件放於 site-packages目錄中

3 cmd 命令行轉到site-packages 文件夾下 輸入命令:python setup.py sdist 回車 在dist文件夾下生成:meal-1.0.tar.gz 單文件發布版本

 

 5 安裝:使用命令:python setup.py install

小結

模塊就是python源文件。是可重用的代碼片段,遵循規則:

為模塊和模塊中的所有類、方法和函數建立文件

測試模塊並包含至少一個測試函數

定義要導出模塊中的哪些項,包括哪些類或函數等

為使用模塊時可能出現的問題創建需要的任何異常類

處理模塊本身作為一個python腳本執行的情況

可以使用help 函數顯示模塊的文檔 reload函數重新加載改變的模塊

在創建了一個模塊之后,可以使用 distutils創建一個模塊 發布包,需要創建一個setup.py腳本

可以使用dir()函數瀏覽模塊的屬性,必須使用import語句導入后才可以使用。也可以使用 from module import item 

python在特定的位置搜索模塊文件。sys.path函數查看位置

面向對象編程由封裝、繼承、多態組成

使用三引號為模塊中的對象創建文檔,第一個三引號開始注釋,第二個三引號結束注釋

如果定義了__all__變量,可以列出組成模塊的公有api的那些項:__all__=['','']

如果沒有定義__all__變量,python解釋器將查找名稱不以下划線形如的所有項

在變量sys.path列出的目錄中查詢系統中模塊的位置,需要首先導入 sys模塊。

模塊中可以放置任何python命令。模塊可以包含python命令、python函數、python變量、python類等。但是在大多數情況下,應該避免在模塊中運行命令。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM