国产成人AV无码一二三区,少女1到100集,国产精品久久久久精品综合紧,巜公妇之诱感肉欲HD在线播放

文章 > Python基础教程 > 怎么理解Python中包的引入?

怎么理解Python中包的引入?

头像

Python

2019-06-24 11:16:583170浏览 · 0收藏 · 0评论

Python的from import *和from import *,它们的功能都是将包引入使用,但是它们是怎么执行的以及为什么使用这种语法呢?

从一模块导入全部功能

from import * means意味着“我希望能访问中我有权限访问的全部名称”。例如以下代码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解释器中,我们可以执行from something import *,然后看到如下的内容:

>>> 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__会发生什么。

# 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:

>>> 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

包是怎样的呢?

当从一个包中导入全部时,__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内容(加/减东西)的风险。

关注

关注公众号,随时随地在线学习

本教程部分素材来源于网络,版权问题联系站长!

窝窝影院在线观看免费播放电视剧 | 欧美XBOX与IPHONE| 母与子免费观看大全电视剧邻居大.. | 日韩毛片| 《父债女偿》在线观看全集| 《疯狂72小时》韩剧| 《酒店激战》动漫1-5集免费观.. 《魅魔之耻》1~4集免费看 | 怎么用一支笔把自己弄出粘液 | 空姐4免费高清完整版观看| 法国色情巜宝贝宝贝3| B站未满十八岁可以接广告吗 2..| 欧美大片免费PPT| 《漾出OVER FLOWER》| 年轻的母亲在线观看完整版刘海的...| 《高压监狱2》完整版| 憋尿白丝小肚子凸起高冷知乎 | WWW.77.GOVCN| 美女比基尼游泳图片视频 | 动漫| 公交车上被蹭水后多久自然恢复| 国产69精品久久久久久A片| 全糖可乐| 久我かのん| 韩国电影 办公室的游戏2| 韩剧《喂奶2》的主要内容是什么| 女友躲雨被老头玩弄| 两领导在车上吃我的奶| 美女被咬小头头视频大全图片| 电影《满足2》完整版在线观看| 鲁鲁射击免费播放电视剧全部| 一线产区和二线产区的品牌走位 | 动漫《纯洁的修女》在线看 | 日本大片又大又好看的PPT | 少女与狗2在线观看免费版高清 | 男人吃奶摸下面弄进去会怀孕吗| 妈妈がだけの心に漂う| 女性一晚上3次纵欲导致不孕 | 免费观看《艳乳欲乱2》| 真实双人插画的视频| 97人妻人人躁人人玩人人澡AV| 公交车上萌蒂添的好舒服H漫画