日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python中包含义及其定义

發布時間:2025/3/20 python 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python中包含义及其定义 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對于一個需要實際應用的模塊而言,往往會具有很多程序單元,包括變量、函數和類等,如果將整個模塊的所有內容都定義在同一個 Python 源文件中,這個文件將會變得非常龐大,顯然并不利于模塊化開發。

什么是包

為了更好地管理多個模塊源文件,Python 提供了包的概念。那么問題來了,什么是包呢?

從物理上看,包就是一個文件夾,在該文件夾下包含了一個 init.py 文件,該文件夾可用于包含多個模塊源文件;從邏輯上看,包的本質依然是模塊。

根據上面介紹可以得到一個推論,包的作用是包含多個模塊,但包的本質依然是模塊,因此包也可用于包含包。典型地,當我們為 Python 安裝了 numpy 模塊之后,可以在 Python 安裝目錄的 Lib\site-packages 目錄下找到一個 numpy 文件夾,它就是前面安裝的 numpy 模塊(其實是一個包)。該文件夾的內容如下圖所示:

從圖 1 可以看出,在 numpy 包(也是模塊)下既包含了 matlib.py 等模塊源文件,也包含了 core 等子包(也是模塊)。這正對應了我們剛剛介紹的:包的本質依然是模塊,因此包又可以包含包。

定義包

掌握了包是什么之后,接下來學習如何定義包。定義包更簡單,主要有兩步:

  • 創建一個文件夾,該文件夾的名字就是該包的包名。
  • 在該文件夾內添加一個 init.py 文件即可。

下面定義一個非常簡單的包。先新建一個 first_package 文件夾,然后在該文件夾中添加一個 init.py 文件,該文件內容如下:

''' 這是學習包的第一個示例 ''' print('this is first_package')

上面的 Python 源文件非常簡單,該文件開始部分的字符串是該包的說明文檔,接下來是一條簡單的輸出語句。

下面通過如下程序來使用該包:

# 導入first_package包(模塊) import first_packageprint('==========') print(first_package.__doc__) print(type(first_package)) print(first_package)

再次強調,包的本質就是模塊,因此導入包和導入模塊的語法完全相同。因此,上面程序中第 2 行代碼導入了 first_package 包。程序最后三行代碼輸出了包的說明文檔、包的類型和包本身。

運行該程序,可以看到如下輸出結果:

this is first package ========== 這是學習包的第一個示例 <class 'module'> <module 'first_package' from 'G:\\publish\\codes\\09\\9.3\\first_package\\__init__.py'>

從上面的輸出結果可以看出,在導入 first_package 包時,程序執行了該包所對應的文件夾下的 init.py;從倒數第二行輸出可以看到,包的本質就是模塊;從最后一行輸出可以看到,使用 import
first_package 導入包的本質就是加載井執行該包下的 init.py 文件,然后將整個文件內容賦值給與包同名的變量,該變量的類型是 module。

與模塊類似的是,包被導入之后,會在包目錄下生成一個 pycache 文件夾,并在該文件夾內為包生成一個 init.cpython-36.pyc 文件。

由于導入包就相當于導入該包下的 init.py 文件,因此我們完全可以在 init.py 文件中定義變量、函數、類等程序單元,但實際上往往并不會這么做。想一想原因是什么?包的主要作用是包含多個模塊,因此 init.py 文件的主要作用就是導入該包內的其他模塊。

下面再定義一個更加復雜的包,在該包下將會包含多個模塊,并使用 init.py 文件來加載這些模塊。

新建一個fk_package包,并在該包下包含三個模塊文件:

  • print_shape.py
  • billing.py
  • arithmetic_chart.py

fk_package 的文件結構如下:

fk_package ┠──arithmetic_chart.py ┠──billing.py ┠──print_shape.py ┗━━__init__.py

其中,arithmetic_chart.py模塊文件的內容如下:

''' 學習中遇到問題沒人解答?小編創建了一個Python學習交流QQ群:725638078 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' def print_multiple_chart(n):'打印乘法口角表的函數'for i in range(n):for j in range(i + 1):print('%d * %d = %2d' % ((j + 1) , (i + 1) , (j + 1)* (i + 1)), end=' ')print('')

上面模塊文件中定義了一個打印乘法口訣表的函數。

billing.py 模塊文件的內容如下:

class Item:'定義代表商品的Item類'def __init__(self, price):self.price = pricedef __repr__(self):return 'Item[price=%g]' % self.price

print_shape.py 模塊文件的內容如下:

def print_blank_triangle(n):'使用星號打印一個空心的三角形'if n <= 0:raise ValueError('n必須大于0')for i in range(n):print(' ' * (n - i - 1), end='')print('*', end='')if i != n - 1:print(' ' * (2 * i - 1), end='')else:print('*' * (2 * i - 1), end='')if i != 0:print('*')else:print('')

tk_package包下的 init.py 文件暫時為空,不用編寫任何內容。

上面三個模塊文件都位于fk_package包下,總共提供了兩個函數和一個類。這意味著 fk_package 包(也是模塊)總共包含arithmetic_chart、 billing 和 print_shape三個模塊。在這種情況下,這三個模塊就相當于fk_package 包的成員。

導入包內成員

如果需要使用 arithmetic_chart、 billing 和 print_shape 這三個模塊,則可以在程序中執行如下導入代碼:

# 導入fk_package包,實際上就是導入包下__init__.py文件 import fk_package # 導入fk_package包下的print_shape模塊, # 實際上就是導入fk_package目錄下的print_shape.py import fk_package.print_shape # 實際上就是導入fk_package包(模塊)導入print_shape模塊 from fk_package import billing # 導入fk_package包下的arithmetic_chart模塊, # 實際上就是導入fk_package目錄下的arithmetic_chart.py import fk_package.arithmetic_chartfk_package.print_shape.print_blank_triangle(5) im = billing.Item(4.5) print(im) fk_package.arithmetic_chart.print_multiple_chart(5)

上面程序中第 2 行代碼是“import fk_package”,由于導入包的本質只是加載并執行包里的 init.py 文件,因此執行這條導入語句之后,程序只能使用 fk_package 目錄下的 init.py 文件中定義的程序單元。對于本例而言,由于 fk_package_init_.py 文件內容為空,因此這條導入語句沒有任何作用。

第 5 行導入語句的本質就是加載并執行 fk_package 包下的 print_shape.py 文件,并將其賦值給 fk_package.print_shape 變量。因此執行這條導入語句之后,程序可訪問 fk_package\print_shape.py 文件所定義的程序單元,但需要添加 fk_package.print_shape 前綴。

第 8 行導入語句的本質是導入 fk_package 包(也是模塊)下的 billing 成員(其實是模塊)。因此執行這條導入語句之后,程序可使用 fk_package\billing.py 文件定義的程序單元,而且只需要添加 billing 前綴。

第 11 行代碼與第 5 行代碼的導入效果相同。

該程序后面分別測試了 fk_package包下的 print_shape、billing、arithmetic_chart 這三個模塊的功能。運行上面程序,可以看到三個模塊的功能完全可以正常顯示。

上面程序雖然可以正常運行,但此時存在兩個問題:

  • 為了調用包內模塊中的程序單元,需要使用很長的前綴,這實在是太麻煩了。
  • 包內 init.py 文件的功能完全被忽略了。

想一想就知道,包內的 init.py 文件并不是用來定義程序單元的,而是用于導入該包內模塊的成員,這樣即可把模塊中的成員導入變成包內成員,以后使用起來會更加方便。

將fk_package包下的 init.py 文件編輯成如下形式:

''' 學習中遇到問題沒人解答?小編創建了一個Python學習交流QQ群:725638078 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' # 從當前包導入print_shape模塊 from . import print_shape # 從.print_shape導入所有程序單元到fk_package中 from .print_shape import * # 從當前包導入billing模塊 from . import billing # 從.billing導入所有程序單元到fk_package中 from .billing import * # 從當前包導入arithmetic_chart模塊 from . import arithmetic_chart # 從.arithmetic_chart導入所有程序單元到fk_package中 from .arithmetic_chart import *

該程序的代碼基本上差不多,都是通過如下兩行代碼來處理導入的:

# 從當前包導入print_shape模塊 from . import print_shape # 從.print_shape導入所有程序單元到fk_package中 from .print_shape import *

上面第一行 from…import 用于導入當前包(模塊)中的 print_shape(模塊),這樣即可在 tk_package 中使用 print_shape 模塊。但這種導入方式是將 print_shape 模塊導入了 fk_package 包中,因此當其他程序使用 print_shape 內的成員時,依然需要通過 fk_package.print_shape 前綴進行調用。

第二行導入語句用于將 print_shape 模塊內的所有程序單元導入 fk_package 模塊中,這樣以后只要使用 fk_package.前綴就可以使用三個模塊內的程序單元。例如如下程序:

# 導入fk_package包,實際上就是導入包下__init__.py文件 import fk_package# 直接使用fk_package前綴即可調用它所包含的模塊內的程序單元。 fk_package.print_blank_triangle(5) im = fk_package.Item(4.5) print(im) fk_package.print_multiple_chart(5)

上面第 2 行代碼是導入 tk_package 包,導入該包的本質就是導入該包下的 init.py 文件。而 init.py 文件又執行了導入,它們會把三個模塊內的程序單元導入 tk_package 包中,因此程序的下面代碼可使用 tk_package.前綴來訪問三個模塊內的程序單元。

運行上面程序,同樣可以看到正常的運行結果。

結尾給大家推薦一個非常好的學習教程,希望對你學習Python有幫助!

Python基礎入門教程推薦:更多Python視頻教程-關注B站:Python學習者
https://www.bilibili.com/video/BV1LL4y1h7ny?share_source=copy_web

Python爬蟲案例教程推薦:更多Python視頻教程-關注B站:Python學習者
https://www.bilibili.com/video/BV1QZ4y1N7YA?share_source=copy_web

總結

以上是生活随笔為你收集整理的Python中包含义及其定义的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。