小編給大家分享一下Python中如何使用語句導(dǎo)入模塊或包,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
我們提供的服務(wù)有:成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、鄱陽ssl等。為上1000+企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的鄱陽網(wǎng)站制作公司從一個(gè)模塊導(dǎo)入全部
from import * means意味著“我希望能訪問中我有權(quán)限訪問的全部名稱”。例如以下代碼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)入了除了以_開頭名稱外的其他所有名稱,按照規(guī)范,_開始的名稱是私有的所以未被導(dǎo)入。
嗯,不是特別糟!還有什么?
上面沒提到__all__是什么。all__是一個(gè)字符串列表,指定了當(dāng)from import *被使用時(shí),模塊(或者如后文會(huì)提到的包)中的哪些符號(hào)會(huì)被導(dǎo)出。如果我們不定義__all(我們?cè)谏厦娴膕omething.py就沒定義),import *默認(rèn)的導(dǎo)入方式是導(dǎo)入除了下劃線(_)開頭的所有名稱。再說一次,編程慣例上下劃線表示一個(gè)符號(hào)是私有的,不導(dǎo)入是合理的。讓我們來看看在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鄭州做人流手術(shù) http://rl.zyfuke.com/
現(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__的做法和模塊基本一樣,不過它處理的是包中的模塊(而不是把模塊中的名都導(dǎo)入)。所以當(dāng)我們使用from import *.時(shí)__all__說明了所有需要被導(dǎo)入當(dāng)前命名空間的模塊。
不同之處在于,如果你在一個(gè)包的__init__.py里面沒有聲明__all__,from import *語句不會(huì)導(dǎo)入任何東西(這個(gè)說法也不全對(duì),正確的說法在此)
但是,這有什么不好?
寫到這里,給大家推薦一個(gè)資源很全的python學(xué)習(xí)聚集地,點(diǎn)擊進(jìn)入,這里有資深程序員分享以前學(xué)習(xí)
心得,學(xué)習(xí)筆記,還有一線企業(yè)的工作經(jīng)驗(yàn),且給大家精心整理一份python零基礎(chǔ)到項(xiàng)目實(shí)戰(zhàn)的資料,
每天給大家講解python最新的技術(shù),前景,學(xué)習(xí)需要留言的小細(xì)節(jié)
from import * 是不明確的。它沒告訴我們我們正在導(dǎo)入什么或者我們把什么帶入當(dāng)前命名空間了。更好的做法是顯式地導(dǎo)入我們需要的全部名稱。這種方式下,讀者(非??赡苁俏磥淼哪阕约?就不會(huì)困惑于你代碼中使用的一個(gè)變量/方法/類/其他東西是哪兒來的,這也告訴了我們下一點(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能很快地告訴你它們是哪兒來的。
同時(shí),你還總是要承擔(dān)模塊/包作者更改list內(nèi)容(加/減東西)的風(fēng)險(xiǎn)。也就是下面兩者之一:
作者從__all__里刪除了一個(gè)字符串。如果你的代碼使用了那個(gè)名字,你的代碼就會(huì)報(bào)出NameError的錯(cuò)誤,并且很難發(fā)現(xiàn)為什么。
作者在__all__里加入了很多東西。你也許不需要這些增加的內(nèi)容,所以你只是讓這些你不關(guān)心的東西占滿了你的命名空間。他們甚至在你不注意的時(shí)候會(huì)替代其他同名內(nèi)容。
以上是“Python中如何使用語句導(dǎo)入模塊或包”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道!