一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 如何理解Python中包的引入

如何理解Python中包的引入

2020-05-29 11:11Python中文網 Python

在本篇文章里小編給各位分享的是一篇關于Python中包的引入詳解內容,需要的朋友們可以參考學習下。

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

從一模塊導入全部功能

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

?
1
2
3
4
5
6
7
8
9
10
11
# 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解釋器中,我們可以執行from something import *,然后看到如下的內容:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> 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
<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__會發生什么。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
# 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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
# 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

包是怎樣的呢?

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

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

但是,這有什么不好?

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

明確比含糊要好。

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

可讀性很重要

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

?
1
2
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中包的引入詳解的資料請關注服務器之家其它相關文章!

原文鏈接:https://www.py.cn/jishu/jichu/10464.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产目拍亚洲精品一区二区三区 | 国产精品久久国产精品99 gif | 欧美人与禽交片在线播放 | 国产日韩在线 | 国产目拍亚洲精品一区二区三区 | 青青色综合 | 1024毛片 | 好男人免费高清在线观看2019 | 国产精品99爱免费视频 | 2021国产精品视频 | 91香蕉视频在线 | 日本888 xxxx| xnxx18美女 | 麻豆在线传煤 | 久久一er精这里有精品 | bt天堂在线最新版在线 | 九九成人免费视频 | 色综合色狠狠天天综合色 | 97porm自拍视频区原创 | www亚洲国产 | aaa毛片在线 | 精品国产乱码久久久久久软件 | 午夜久久久久久亚洲国产精品 | 九9热这里只有真品 | 欧美bbb人妖 | 国产v在线在线观看羞羞答答 | 情缘免费观看完整版 | 五月天91 | 亚洲精品久久久打桩机 | 四虎麻豆 | 日韩欧美亚洲国产高清在线 | 99精品久久精品一区二区小说 | 国产精品亚洲片在线不卡 | 欧美日韩视频一区三区二区 | 国产特黄一级一片免费 | 好大好猛好深好爽视频 | 扒开双腿羞辱调教play视频 | 九九九九九九伊人 | 2019nv天堂| 天天做天天爱天天爽综合区 | 97午夜视频|