python包和目录有什么不同_python中的Module和package以及不同的导入方式

首先要明确一下,什么是python中的包,什么是package的问题。

Python包(package),是一个目录,该目录下包括了__init__.py文件(在新版本(python3.2之后)的python中,没有这个文件,也会被python认为是一个包,这个文件的作用和目的是为简化包中的模块的导入过程),以及其他功能的py文件。

Python模块(module),一个py文件就是一个module。

模块的导入:Python __init__.py 作用详解 - 简书 (jianshu.com)​www.jianshu.com

当我们去 import 一个 Package 的时候,它会隐性的去执行 __init__.py , 而在 __init__.py 中定义的对象,会被绑定到当前的命名空间里面来。

比如有时候我们会这样去导入一个包下的所有模块,会这样操作:

from package_name import *

但这个时候你会发现并没有将相关的子模块导入进来,这时候你可能想到了,可以在父模块中的 __init_.py 做文章,先把它们导入进来不就行了. 这个时候就会使用到_all_=[] 这个全局变量。

我们把_all=[‘one’, 'two', 'three']这行代码加入到init_.py这个文件中。

再次执行 from package_name import *

就会发现将所有子模块都导入了。学习python的正确姿势:你常常看到的 __init__.py 到底是个啥?​zhuanlan.zhihu.comv2-e9c4cce7c615902dcb59fe018d4c1b21_180x120.jpg

综上,__init__.py 会在 import 的时候被执行,而空的 __init__.py 在Python新版本中已经不需要你额外去定义了,因为就算你不定义 init, Python 也知道你导入的包路径,但是如果你想要做一些初始化操作,或者像我们刚刚说的预先导入相关的模块,那么定义 __init__.py 还是很有必要的哟。

另外

import xx和 from xx import fun有什么区别:

import xx导入模块对于模块中的函数,每次调用需要“模块.函数”来用。

from xx import fun 直接导入模块中某函数,直接fun()就可用。

告诉你大法:from xx import * 该模块中所有函数可以直接使用。

import xx导入模块对于模块中的函数,每次调用需要“模块.函数”来用。

from xx import fun 直接导入模块中某函数,直接fun()就可用。

告诉你大法:from xx import * 该模块中所有函数可以直接使用。

当有一个包名为pname时,其内部的*.py文件的模块名就是pname.*, 也就是说模块名中包含了package包这个概念。

作者:苏格拉底

链接:https://www.zhihu.com/question/38857862/answer/230127705

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

解决两个问题即可搞清楚两者的异同

1、import后面可以跟什么

1)可以跟文件名、目录名(当然最好理解为包名),这样就类似include 这样的语句,将文件加入而已。

import example1.example1_1 #这里就是将example1/example1_1.py 引入

或者可以使用from

from example1 import example1_1

从这里可以看出,如果从引入文件的角度出发,from后面的内容和import后面的内容相似,都是文件名或者目录名。这种方式,的确不容易判断example1_1到底是一个文件、目录或是example1_1()这样一个方法。

调用的时候,必须按照import后面的包的完整结构进行调用

example1_1.say_hello()

2)可以跟类名、方法名

from example1.example1_1 import say_hello #从目录、包或文件中引入一个方法

say_hello() #可以直接调用;

from example1.example1_1 import User #从目录、包或者文件中引入一个类

User('name'='xiaoming')#可以直接调用

2、from后面可以跟什么

只能是文件、目录或者包。

推荐的写法,使用“from 包名 import 方法/类”然后直接调用方法或者类的书写方式。

当然,如果import只是将整个文件包进来,仅作文件的连接,两种方式就没有什么区别。

梳理一下我刚刚理解的内容import Module:相当于只是给该Module做一个声明?如果要用的话,还是得Module.function()这样使用,因为其内部的成员,函数之类并没有被【实际装载】到编辑器或内存?(不知道我这样表述是否准确)

from Module import function:相当于将Module中的function()部分装载到了内存中或编辑器中?所以能直接function()调用?

from Module import *:相当于将Module中的所有内容全都转载到了内存或编辑器中,不仅能直接用function()还可以直接用function1(),function2().....?

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值