日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)Python教程:怎么理解Python中包的引入?

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

從一模塊導入全部功能

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中導入了除了以_開頭名稱外的其他所有名稱,按照規(guī)范,_開始的名稱是私有的所以未被導入。

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

包是怎樣的呢?

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

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

但是,這有什么不好?

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

明確比含糊要好。

from import * 是不明確的。它沒告訴我們我們正在導入什么或者我們把什么帶入當前命名空間了。更好的做法是顯式地導入我們需要的全部名稱。這種方式下,讀者(非??赡苁俏磥淼哪阕约海┚筒粫Щ笥谀愦a中使用的一個變量/方法/類/其他東西是哪兒來的,這也告訴了我們下一點:

可讀性很重要

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

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

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

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


新聞名稱:創(chuàng)新互聯(lián)Python教程:怎么理解Python中包的引入?
文章起源:http://m.5511xx.com/article/djejcig.html