亚洲免费在线视频-亚洲啊v-久久免费精品视频-国产精品va-看片地址-成人在线视频网

您的位置:首頁技術文章
文章詳情頁

如何理解Python中包的引入

瀏覽:104日期:2022-07-24 08:28:40

Python的from import *和from import *,它們的功能都是將包引入使用,但是它們是怎么執行的以及為什么使用這種語法呢?

從一模塊導入全部功能

from import * means意味著“我希望能訪問中我有權限訪問的全部名稱”。例如以下代碼something.py:

# something.pypublic_variable = 42_private_variable = 141def public_function(): print('I’m a public function! yay!')def _private_function(): print('Ain’t nobody accessing me from another module...usually')class PublicClass(object): passclass _WeirdClass(object): pass

在Python解釋器中,我們可以執行from something import *,然后看到如下的內容:

>>> from something import *>>> public_variable42>>> _private_variable...NameError: name ’_private_variable’ is not defined>>> public_function()'I’m a public function! yay!'>>> _private_function()...NameError: name ’_private_function’ is not defined>>> c = PublicClass()>>> c<something.publicclass object='' at='' ...=''>>>> c = _WeirdClass()...NameError: name ’_WeirdClass’ is not defined

from something import *從something中導入了除了以_開頭名稱外的其他所有名稱,按照規范,_開始的名稱是私有的所以未被導入。

上面沒提到__all__是什么。__all__是一個字符串列表,指定了當from import *被使用時,模塊(或者如后文會提到的包)中的哪些符號會被導出。如果我們不定義__all__(我們在上面的something.py就沒定義),import *默認的導入方式是導入除了下劃線(_)開頭的所有名稱。再說一次,編程慣例上下劃線表示一個符號是私有的,不導入是合理的。讓我們來看看在something.py中定義我們自己的__all__會發生什么。

# something.py__all__ = [’_private_variable’, ’PublicClass’]# The rest is the same as beforepublic_variable = 42_private_variable = 141def public_function(): print('I’m a public function! yay!')def _private_function(): print('Ain’t nobody accessing me from another module...usually')class PublicClass(object): passclass _WeirdClass(object): pass

現在,我們期望from something import *只會導入_private_variable和PublicClass:

# something.py__all__ = [’_private_variable’, ’PublicClass’]# The rest is the same as beforepublic_variable = 42_private_variable = 141def public_function(): print('I’m a public function! yay!')def _private_function(): print('Ain’t nobody accessing me from another module...usually')class PublicClass(object): passclass _WeirdClass(object): pass

包是怎樣的呢?

當從一個包中導入全部時,__all__的做法和模塊基本一樣,不過它處理的是包中的模塊(而不是把模塊中的名都導入)。所以當我們使用from import *.時__all__說明了所有需要被導入當前命名空間的模塊。

不同之處在于,如果你在一個包的__init__.py里面沒有聲明__all__,from import *語句不會導入任何東西(這個說法也不全對,正確的說法在此)

但是,這有什么不好?

繼續讀之前,在你的Python解釋器中,執行import this,再讀一遍Python之禪(在你孩子每晚睡前也要讀給他們)。

明確比含糊要好。

from import * 是不明確的。它沒告訴我們我們正在導入什么或者我們把什么帶入當前命名空間了。更好的做法是顯式地導入我們需要的全部名稱。這種方式下,讀者(非常可能是未來的你自己)就不會困惑于你代碼中使用的一個變量/方法/類/其他東西是哪兒來的,這也告訴了我們下一點:

可讀性很重要

即使你需要導入很多東西,一個一個顯式地導入也更清楚。使用PEP 328:

from Tkinter import (Tk, Frame, Button, Entry, Canvas, Text, LEFT, DISABLED, NORMAL, RIDGE, END)

你現在就能明確知道你的命名空間里有什么,使用ctrl+f能很快地告訴你它們是哪兒來的。

同時,你還總是要承擔模塊/包作者更改list內容(加/減東西)的風險。

內容擴展:

基本注意點

模塊:一般指一個py文件;包:含有許多py文件的文件夾,含有 或不含有(Python3中允許)__init__文件。 凡是在導入時帶點的,點的左邊都必須是一個包 (import a.fun1 其中a為py文件)這種導入形式是錯誤的。 2.from a import fun1 a為一個py文件,fun1為該文件的屬性或方法,這種導入形式是可以的。 一般來說 import 后面不能帶點,如:(from a import b.c是錯誤語法) 導入模塊時,是將模塊的py文件導入進去(執行);導入包時,只會執行包中的__init__文件中的代碼,故導入包時一般要導入到最底層,即from dir1.dir2.dir3 import py文件或者類、方法、屬性,只有這樣才能找到。但是你可以通過先導入一個包,然后在包的文件中的__init__中寫相關的import語句(可以絕對,也可以相對),這樣也可以通過import 包名 的方式將包中的東西導入進去。

以上就是如何理解Python中包的引入的詳細內容,更多關于Python中包的引入詳解的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 一级女性全黄生活片免费 | 精品成人免费一区二区在线播放 | 免费一级真人毛片 | 颜值超高的女神啪啪 | 日韩三级中文字幕 | 国产欧美另类久久精品91 | 色综合久久88色综合天天提莫 | 特及毛片| 男女在线观看视频 | 欧美精品亚洲人成在线观看 | 色www亚洲| 国产精品色综合久久 | 国产夜色 | 一级做a爱久久久久久久 | 两性色午夜视频免费国产 | 欧美人成片免费看视频不卡 | 久久www免费人成看国产片 | 在线毛片观看 | 午夜在线视频一区二区三区 | 成人a大片高清在线观看 | 久久精品免费观看国产软件 | 精品国产自在在线在线观看 | 国产高清在线精品一区二区 | 69精品免费视频 | 欧美日韩日本国产 | 99国产福利视频区 | 亚洲精品一区二区三区中文字幕 | 手机亚洲第1页 | 综合在线播放 | 成人黄18免费网站 | 亚洲免费视频一区 | 久久99精品视香蕉蕉 | 日韩一区二区三区免费视频 | 色欧美在线 | 午夜专区 | 亚洲人成在线观看 | 久久欧美精品欧美九久欧美 | 爱爱爱久久久久久久 | 欧美三级aaa | 午夜成人在线视频 | 在线精品欧美日韩 |