python import 模块/包

模块:一个以.py结尾的文件。模块里包含了我们的一些全局变量/函数的定义/类的定义等。

:一个包含有__init__.py的文件夹,叫做一个包,里面放了一些模块(.py文件)

print("Importing module B")
# from A import hello


"""
单使用import,需要import <模块>
"""
import A  # A是一个模块,
          #单用"iport"导入, 必须要定位到模块这一层级
A.hello() #使用模块里定义的函数, 可以用这种.的方式


"""
使用from <模块> import <func / class / GLOBAL_VAR>
"""
from A import hello  
hello()


"""
可以通过as对导入的<func / class / GLOBAL_VAR>进行重命名
"""
from A import hello as h
h()


"""
下面这样使用是不对的,因为A不是一个package (有__init__.py这样一个空文件的文件夹,这个文件夹才是
一个package,里面放了很多的module(.py文件)
"""
import A.hello as hello # 这句报错,因为A不是一个包(package)

def world():
    print("World from B")# -*- coding: utf-8 -*-
    

那么这个程序打印的是什么呢:
Importing module B 第一句
Importing module A 在import A的时候运行的
Importing module C 在import A的h时候,导入C的时候运行的
Hello from A # A.hello()输出
Hello from A # hello()输出
Hello from A # h()输出

# 运行from A import hello  /from A import hello as h 没有再输出Importing module A和Importing module C,是因为在 import A 时就已经导入过A模块了。

原则:

包里还可以有子包

import <模块>

import <module.func>: 错! module不是package,点前面应该是package

from <模块> import <func/class/GLOBAL_VAR> as XX

from <package.module> import <func/class/GLOBAL_VAR>

层级:包(包含有__init__.py的folder) include 模块(.py), 模块里有一些func和class之类的定义

参考:

https://pythonhowto.readthedocs.io/zh-cn/latest/module.html

from . import_python首行代码import *,from * import * 解析-CSDN博客

Python在解析导入时会按照以下顺序查找模块或包:

当前工作目录 - Python首先会在当前工作目录中查找
系统路径 - 如果在当前工作目录中找不到,Python会继续搜索系统路径中的其他位置。

---------------------------------------------------------------------------------------------------------

下面看一个练习:

有这样一个文件结构,然后在class_A.py中定义了一个func()函数

看看在main.py中这些import那些正确那些不正确呢?

from class_package.class_folder import class_A
正确,从当前工作目录中的class_package包中找到这个文件夹,从文件夹中导入module class_A


from class_folder.class_A import func

这个也正确!但是不太很规范!因为class_folder不是一个包
问题,这个竟然也正确,class_folder不是一个package呀,怎么能放在.前面呢?
答:Python在解析导入时会按照以下顺序查找模块或包:

(1)当前工作目录 - 
!!!!!
Python首先会在当前工作目录中查找是否存在名为class_folder的【文件夹】或者【package】。
!!!!
(2)系统路径 - 如果在当前工作目录中找不到,Python会继续搜索系统路径中的其他位置。
----------------------------------------------------------------------------------
在您的情况下,虽然class_folder本身并没有被明确声明为一个 Python 包(没有__init__.py文件),
但Python仍会尝试解析导入路径。这种灵活性让您可以从文件夹中导入模块,
但也可能导致一些混淆和潜在的问题,特别是在复杂项目中。
----------------------------------------------------------------------------------

from class_folder import class_A
正确,就是从当前路径下的文件夹中导入一个module

from class_package.class_folder.class_A import func
错误了! 因为class_folder并不是在当前目录下的文件夹,class_package.class_folder必须也得
是一个package才行!

总结:

最规范:from package.module import func()/class/GLOBAL_VAR

python灵活处理:(可以看出,python仅接受将当前工作路径下的文件夹“看作”一个package来宽松对待,对于不在当前工作路径下的文件夹,不能放在.前面。

from 当前工作目录下的文件夹.module import func()/class/GLOBAL_VAR

错误:对应上面的灵活处理

from 当前路径package.folder.module import XXX

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小哇123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值