python package_python之package定義

一.簡單說明

python是通過module組織代碼的,每一個module就是一個python文件,但是modules是通過package來組織的。我們平時在簡單測試的時候

一般就是幾個Python文件存放在同級的目錄下,但是當我們開始嘗試開發更為復雜的項目時,package這個概念的使用就有助于我們寫的一個

個modules。

二.python package

package的定義很簡單,在當前目錄下有__init__.py文件的目錄即為一個package。

這里也會分為兩種情況,一種是空的__init__.py文件,另外一種是包含代碼的__init__.py文件。

無論空與非空,這個目錄都會被認為是一個package。

三.package的初始化

一個package被導入,無論什么時候,init.py的代碼都只會執行一次。

注意:由于package被導入時,init.py中的可執行代碼會被執行,所以小心在package中放置你的代碼,比如把代碼盡可能封裝成函數或類。

3.1 init.py內部的導入順序

當嘗試導入某個包時,如下:

from package import something

import語句會首先檢查something是不是__init__.py的變量。然后檢查是不是subpackage,再檢查是不是module,最后拋出ImportError。

順序如下:

1.init.py文件內變量

2.是不是package內的subpackage

3.是不是package內module

舉例說明:

這里我們創建一個yuhaohao的package,目錄下有sulli1.py sulli2.py init.py文件

文件內容內下:

sulli1.py

#!/usr/bin/python3

def tl():

print("Hello, function 'tl' from module 'sulli1' calling")

sulli2.py

#!/usr/bin/python3

def ol():

print("Hello, function 'ol' from module 'sulli2' calling")

init.py文件內容為空。

[root@centos8 pipeline]# python3

Python 3.6.8 (default, May 21 2019, 23:51:36)

[GCC 8.2.1 20180905 (Red Hat 8.2.1-3)] on linux

Type "help", "copyright", "credits" or "license" for more information.

>>> import yuhaohao

>>> yuhaohao

>>> yuhaohao.sulli1

Traceback (most recent call last):

File "", line 1, in

AttributeError: module 'yuhaohao' has no attribute 'sulli1'

>>> yuhaohao.sulli2

Traceback (most recent call last):

File "", line 1, in

AttributeError: module 'yuhaohao' has no attribute 'sulli2'

可以看出yuhaohao的路徑被包含在python的sys.path的環境變量中。但是sulli1.py和sulli2.py并沒有被導入。

如果想要在import yuhaohao后自動加載sulli1和sulli2模塊,這里可以在__init__.py文件中增加如下內容:

import sulli1

import sulli2

第二種方案就是手動導入,當想使用模塊sulli1中的tl()函數時,需要手動導入

>>> import yuhaohao.sulli1 as yu

>>> yu.tl()

下面是一個更復雜的例子,下載的URL為:https://www.python-course.eu/sound1.tar.bz2

解壓后,文件結構如下:

sound

|-- effects

| |-- echo.py

| |-- __init__.py

| |-- reverse.py

| `-- surround.py

|-- filters

| |-- equalizer.py

| |-- __init__.py

| |-- karaoke.py

| `-- vocoder.py

|-- formats

| |-- aiffread.py

| |-- aiffwrite.py

| |-- auread.py

| |-- auwrite.py

| |-- __init__.py

| |-- wavread.py

| `-- wavwrite.py

`-- __init__.py

這里直接使用import sound來導入這個package時,我們可以導入package sound,但是sound的子package(effects,filters,formats)并不會被自動

導入,子package不會被自動導入的原因是因為在sound目錄下的__init__.py文件并沒有任何關于導入子package的代碼。

導入sound:

>>> import sound

sound package is getting imported!

>>> sound.effects

Traceback (most recent call last):

File "", line 1, in

AttributeError: module 'sound' has no attribute 'effects'

如果你想使用子package的內容,但是在父package的__init__.py的文件內并沒有導入,你需要手動導入

>>> import sound.effects

effects package is getting imported!

>>> sound.effects

如果你希望python幫你自動導入sound.effects你可以往sound目錄下的__init__.py文件寫入

"""An empty sound package

This is the sound package, providing hardly anything!"""

import sound.effects

print("sound package is getting imported!")

當然了,除了使用絕對路徑你可以使用相對路徑來導入sound.effects

"""An empty sound package

This is the sound package, providing hardly anything!"""

from . import effects

print("sound package is getting imported!")

這跟linux的命令行比較像,.代表當前目錄,..代表上級目錄。所以你可以在sound.effects的__init__.py文件內寫入

from .. import formats

參考鏈接:https://www.jianshu.com/p/178c26789011

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370772.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370772.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370772.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

html 手機端無法拖動地圖,關于騰訊地圖api的禁止地圖拖動問題

禁用滾動和拖動*{margin:0px;padding:0px;}body, button, input, select, textarea {font: 12px/16px Verdana, Helvetica, Arial, sans-serif;}p{width:603px;padding-top:3px;overflow:hidden;}.btn{width:142px;}#container{min-width:600px;min-height:767px;}//初始化函數…

《一起》個人進展——Day07

昨天做了些什么:實現登錄界面的美化 今天的計劃:還是準備進行與其他界面的融合 遇到的困難:代碼了解不夠,融合起來會出現bug轉載于:https://www.cnblogs.com/gxt-/p/6828131.html

epoll nio區別_【總結】兩種 NIO 實現:Selector 與 Epoll

我想用這個話題小結下最近這一階段的各種測試和開發。其實文章的內容主要還是想總結一下NIO Socket,以及兩種不同操作系統實現NIO的方式,selector和epoll。問題應該從服務器端開始說起。我們都寫過net包下的socket,用socket的accept方法來等待…

MapReduce的工作原理

一、MapReduce模型框架 MapReduce是一個用于大規模數據處理的分布式計算模型,最初由Google工程師設計并實現的,Google已經將完整的MapReduce論文公開發布了。其中的定義是,MapReduce是一個編程模型,是一個用于處理和生成大規模數據…

react實現多行文本超出加省略號

http://www.css88.com/archives/5206 overflow : hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; 根據該文章方法,放在react項目中發現并不能實現,仔細觀察發現原來react解析出來的css樣…

Google Guava MultiMaps

番石榴 這是系列文章中的第一篇,我將嘗試解釋和探索Google很棒的Guava java庫 。 我在搜索Apache Commons Collections的通用版本時遇到了番石榴(Guava)–我需要一個Bimap并且厭倦了必須使用強制類型轉換來填充我的代碼–但是我發現要好得多…

qq群 html,我的群組-普通群組.html

我的群組-普通群組$axure.utils.getTransparentGifPath function() { return resources/images/transparent.gif; };$axure.utils.getOtherPath function() { return resources/Other.html; };$axure.utils.getReloadPath function() { return resou…

查看PLC IP 端口_西門子828D數控系統X130接口通訊怪異現象(X130手動設置的 IP)...

西門子828D數控系統,調試PLC過程中遇到網絡通信怪異問題(不能直連非要加個路由器),筆記本電腦的以太網網絡直接連接顯示網絡電纜被拔出,如下圖所示:奇怪,怎么出現這種情況了呢,因為我用這臺電腦調試過別的P…

基于嵌入式系統的gnash最小庫依賴關系

已經對gnash的依賴庫作了詳細的分析,下邊是必須依賴的庫:GIF Required libungif-devlibxml2 Required libxml2-devPNG Requir…

git 創建webpack項目_一次create-react-app創建項目升級webpack的流水賬

不再贅述為什么要升級webpack4,有興趣的小伙伴可以看一下 知乎:如何評價webpack4下面擼起袖子開干:克隆項目,新建分支git checkout -b feature_webpack_upgrade# 相當于以下兩句的簡寫git branch feature_webpack_upgradegit chec…

bzoj1263

貪心 n%31 分出一個4&#xff0c;其余用3&#xff0c;n%32&#xff0c;分出一個2&#xff0c;其余用3&#xff0c;然后高精度就行了 #include<bits/stdc.h> using namespace std; const int N 5005; struct BigInt {int len;int a[N];BigInt() { memset(a, 0, sizeof(a)…

c語言volatile_[技術]為什么單片機C語言編程時某一變量有時亂碼

最近一個項目里面&#xff0c;在KEIL中用C語言在單片機里面定義了一個狀態機全局變量&#xff0c;這個變量隨時會改變&#xff0c;用于切換觸摸屏的界面&#xff0c;可是程序運行中出現了一個問題&#xff0c;這個狀態機號總是出現了被莫名奇妙改變的問題&#xff0c;導致觸屏不…

沙箱Java代碼

在上一篇文章中&#xff0c;我們研究了如何保護移動Java代碼 。 這樣做的一種選擇是在籠子或沙箱中運行代碼。 這篇文章探討了如何為Java應用程序設置這樣的沙箱。 安全經理 Java中支持沙箱的安全性設施是java.lang.SecurityManager 。 默認情況下&#xff0c;Java在沒有Se…

微型計算機2017年9月上,2017年9月計算機一級考試WPS Office沖刺題

2017年9月計算機一級考試WPS Office沖刺題2017年下半年計算機一級考試將在9月份進行&#xff0c;為了方便考生備考計算機一級考試。下面是小編為大家帶來的計算機一級考試WPS Office沖刺題&#xff0c;歡迎閱讀。沖刺題一&#xff1a;1、PowerPoint 演示文稿和模板的擴展名是【…

七. 多線程編程5.創建多線程

到目前為止&#xff0c;我們僅用到兩個線程&#xff1a;主線程和一個子線程。然而&#xff0c;你的程序可以創建所需的更多線程。例如&#xff0c;下面的程序創建了三個子線程&#xff1a;// Create multiple threads.class NewThread implements Runnable { String name; /…

11尺寸長寬 iphone_弱電工程LED顯示屏尺寸規格及計算方法

前言&#xff1a;led屏幕在生活中&#xff0c;隨處可見&#xff0c;顯示屏、廣播屏等等&#xff0c;但是led尺寸怎么計算的&#xff0c;你知道嗎&#xff1f;今天我們一起了解一下led屏幕尺寸的計算方法。正文&#xff1a;一、點間距的計算1、各單元板常見型號及尺寸LED屏普遍是…

marquee標簽的使用

<!DOCTYPE html> <html> <head><meta charset"utf-8" /><title>演示marquee</title><style type"text/css">*{padding: 0px;margin: 0px;}marquee{border: 1px solid purple;}img{width: 360px;height: auto;}&…

32位數據源中沒有mysql_[SpringBoot實戰]快速配置多數據源(整合MyBatis)

前言由于業務需求&#xff0c;需要同時在SpringBoot中配置兩套數據源&#xff08;連接兩個數據庫&#xff09;&#xff0c;要求能做到service層在調用各數據庫表的mapper時能夠自動切換數據源&#xff0c;也就是mapper自動訪問正確的數據庫。本文內容&#xff1a;在SpringbootM…

考研計算機冷門學校,考研5個冷門的985院校 別隨大流,這些幾所也是很不錯的...

導語&#xff1a;想必大家考研的目的有很多&#xff0c;最主要的就是想去更好的學校提升自己&#xff0c;大部分會肯定是會更傾向于985這類的院校&#xff0c;每年其實除了那些被“擠破頭”的985院校&#xff0c;其實還有不少“低調”的985院校是非常值得報考的&#xff0c;下面…

名為 cursor_jinserted 的游標不存在_質量工程師必須了解的測量常識,你不知道怎么行...

01測量器具的分類測量器具是一種具有固定形態、用以復現或提供一個或多個已知量值的器具。按用途的不同量具可分為以下幾類&#xff1a;1. 單值量具只能體現一個單一量值的量具。可用來校對和調整其它測量器具或作為標準量與被測量直接進行比較&#xff0c;如量塊、角度量塊等。…