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

>>> 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中导入了除了以_开头名称外的其他所有名称,按照规范,_开始的名称是私有的所以未被导入。

上面没提到__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 * 是不明确的。它没告诉我们我们正在导入什么或者我们把什么带入当前命名空间了。更好的做法是显式地导入我们需要的全部名称。这种方式下,读者(非常可能是未来的你自己)就不会困惑于你代码中使用的一个变量/方法/类/其他东西是哪儿来的,这也告诉了我们下一点:

可读性很重要

即使你需要导入很多东西,一个一个显式地导入也更清楚。使用PEP 328:

?

1

2

from Tkinterimport (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

python怎么导入包-如何理解Python中包的引入相关推荐

  1. python if _name_==_main__如何理解Python中的if __name__ == ‘__main__’

    转自:https://blog.csdn.net/yjk13703623757/article/details/77918633/ 对内容进行了部分筛选 1. 摘要 通俗的理解__name__ == ...

  2. python绝对导入_[编程基础] Python中的绝对导入与相对导入

    如果您从事的Python项目有多个文件,那么您以前可能不得不使用import语句.即使对于拥有多个项目的Python重度使用者(比如我),import也可能会造成混淆!您可能正在阅读本文,因为您想对P ...

  3. 为什么一个程序中变量只能定义一次_#带你学Python# 从简单程序出发理解Python基本语法

    欢迎回来. 通过上一篇文章,我们第一次触摸了Python,学会了如何用各种不同的方式运行Python的解释器.也介绍了很多工具和开发环境,是不是跃跃欲试了? 到这里,别的python教程就会从数据类型 ...

  4. python多级目录import_深入理解Python中import机制

    大型项目中为了维护方便,通常使用模块化开发,模块化的过程中,就会涉及到各种包或者模块的相互导入,即使是对于有多个项目的Python开发者来说, import 也会让人困惑!本文带你深入了解python ...

  5. python参数传递方法_深入理解python中函数传递参数是值传递还是引用传递

    python 的 深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是&q ...

  6. python iterable对象_如何理解Python中的iterable对象

    转载请注明出处:https://www.jianshu.com/u/5e6f798c903a [^*] 表示注脚,在文末可以查看对应连接,但简书不支持该语法. 首先,容器和 iterable 间没有必 ...

  7. python怎么导入sql数据库,##使用python将excel表中数据导入sql server数据库

    如何用python将excel数据导入到postgresql数据库中 把excel表格另存为csv文件 python将exce文件含有多个sheet同时l导入sqlserver数据库 需要使用xlrd ...

  8. python导包的问题_python中包引入遇到的问题

    最近在用python的flask时候发现一点问题,代码组织如下 |-app |-__init__.py |-views.py |-operations.py |-xxx.py |-run.py 按照p ...

  9. python装饰器原理-深刻理解python装饰器

    我们要完全理解python装饰器,不是很容易,主要归结有如下困难: 1. 关于函数"变量"(或"变量"函数)的理解 2. 关于高阶函数的理解 3. 关于嵌套函数 ...

最新文章

  1. Spring之定时任务基本使用篇
  2. leetcode-34-在排序数组中查找元素的第一个和最后一个位置
  3. JavaScript-原生Array对象方法详解(一)
  4. 【渗透测试】一次授权的渗透测试——建议收藏
  5. LSTM+MDN【混合密度网络】---sketch rnn
  6. 一文弄懂“分布式锁”
  7. 电脑是个神奇的东西!
  8. 【转】无线路由器密码破解
  9. java案例-酒店管理系统(ssm+mysql+nginx)
  10. 电驴服务器更新的作用,[转载]【强烈推荐更新】最新电驴服务器列表(2013.7.11)...
  11. 06-数据类型的常用操作-字符串常用操作
  12. 模型无关的全局特征依赖分析方法 I ——部分依赖曲线分析与条件依赖曲线分析
  13. 结构化英语查询语言SQL
  14. SN/CF 5W-40含义
  15. 检测tomcat 在CentOS 上的运行状态,发送邮件
  16. 网站忘记密码,如何找回 -- (前提浏览器保存过密码)
  17. 影像组学ibex_影像组学的基本概念与临床应用
  18. 元宇宙 vs. 数字孪生:技术演化的视角
  19. 基于微信小程序在线电子书阅读系统开题报告
  20. Linux用telnet判断端口是否通

热门文章

  1. golang--sync.WaitGroup使用示例
  2. 计算机网络——互动百科
  3. 计算C#程序执行时间
  4. CubieBoard开发板数据源介绍
  5. [MySQL FAQ]系列 -- Too many open files
  6. netstat 查看监听的端口程序
  7. POJ1573-Robot Motion
  8. python快速编程入门课后题答案-python语言程序设计基础(嵩天)第四章课后习题部分答案...
  9. python语言程序设计2019版第二章课后答案-《python语言程序设计》_第二章编程题...
  10. 如何自学python基础-零基础小白该如何学习Python?