真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python中包的引入怎么理解

Python中包的引入怎么理解?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

成都創(chuàng)新互聯(lián)公司主要從事網(wǎng)站制作、成都網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)達(dá)日,10余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專(zhuān)業(yè),歡迎來(lái)電咨詢(xún)建站服務(wù):028-86922220

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

從一模塊導(dǎo)入全部功能

from import * means意味著“我希望能訪(fǎng)問(wèn)中我有權(quán)限訪(fǎng)問(wèn)的全部名稱(chēng)”。例如以下代碼something.py:

# something.py
  
public_variable = 42
_private_variable = 141
  
def 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):
  pass
  
class _WeirdClass(object):
  pass

在Python解釋器中,我們可以執(zhí)行from something import *,然后看到如下的內(nèi)容:

>>> from something import *
>>> public_variable
42
>>> _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

>>> c = _WeirdClass()
...
NameError: name '_WeirdClass' is not defined

from something import *從something中導(dǎo)入了除了以_開(kāi)頭名稱(chēng)外的其他所有名稱(chēng),按照規(guī)范,_開(kāi)始的名稱(chēng)是私有的所以未被導(dǎo)入。

上面沒(méi)提到__all__是什么。__all__是一個(gè)字符串列表,指定了當(dāng)from import *被使用時(shí),模塊(或者如后文會(huì)提到的包)中的哪些符號(hào)會(huì)被導(dǎo)出。如果我們不定義__all__(我們?cè)谏厦娴膕omething.py就沒(méi)定義),import *默認(rèn)的導(dǎo)入方式是導(dǎo)入除了下劃線(xiàn)(_)開(kāi)頭的所有名稱(chēng)。再說(shuō)一次,編程慣例上下劃線(xiàn)表示一個(gè)符號(hào)是私有的,不導(dǎo)入是合理的。讓我們來(lái)看看在something.py中定義我們自己的__all__會(huì)發(fā)生什么。

# something.py
  
__all__ = ['_private_variable', 'PublicClass']
  
# The rest is the same as before
  
public_variable = 42
_private_variable = 141
  
def 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):
  pass
  
class _WeirdClass(object):
  pass

現(xiàn)在,我們期望from something import *只會(huì)導(dǎo)入_private_variable和PublicClass:

>>> from something import *
>>> public_variable
42
>>> _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

>>> c = _WeirdClass()
...
NameError: name '_WeirdClass' is not defined

包是怎樣的呢?

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

不同之處在于,如果你在一個(gè)包的__init__.py里面沒(méi)有聲明__all__,from import *語(yǔ)句不會(huì)導(dǎo)入任何東西(這個(gè)說(shuō)法也不全對(duì),正確的說(shuō)法在此)

但是,這有什么不好?

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

明確比含糊要好。

from import *是不明確的。它沒(méi)告訴我們我們正在導(dǎo)入什么或者我們把什么帶入當(dāng)前命名空間了。更好的做法是顯式地導(dǎo)入我們需要的全部名稱(chēng)。這種方式下,讀者(非??赡苁俏磥?lái)的你自己)就不會(huì)困惑于你代碼中使用的一個(gè)變量/方法/類(lèi)/其他東西是哪兒來(lái)的,這也告訴了我們下一點(diǎn):

可讀性很重要

即使你需要導(dǎo)入很多東西,一個(gè)一個(gè)顯式地導(dǎo)入也更清楚。使用PEP 328:

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

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

同時(shí),你還總是要承擔(dān)模塊/包作者更改list內(nèi)容(加/減東西)的風(fēng)險(xiǎn)。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。


文章題目:Python中包的引入怎么理解
分享鏈接:http://weahome.cn/article/jjghph.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部