Python学海无涯路【第22回】:模块导入和__name__

本文深入探讨Python中的包和模块概念,解析__init__.py的作用,详细讲解不同环境下模块的导入方式,包括同包和跨包导入,以及动态模块导入技巧。同时,文章还介绍了__name__属性的运用,帮助读者理解模块在不同场景下的执行行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1、 Package

文件夹下有“__init__.py”就是Package。否则就是普通文件夹

如下图:
在这里插入图片描述

2、__ init__.py的作用

package被调用时,会道先运行__ init__.py文件下的程序
例:
在这里插入图片描述

__ init__.py的代码:

print("来自__ init__.py")

bin.py的代码:

import year
print("bin.py通常作为python的入口文件")

运行bin.py

输出:
来自__ init__.py
bin.py通常作为python的入口文件
注:bin.py运行时选运行了__ init__.py下的代码

3、模块的导入

一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行

3.1、同Package下

例一:
在这里插入图片描述
bin.py的代码:

#bin.py
import year
print(year.getYear())

year.py的代码:

#year.py
def getYear():
    return 2019

运行bin.py输出:
2019
注:这种导入方法,调用year.py文件下的getYear函数时,必须year.getYear
若想省去文件名year,bin.py改以用以下方法调用

#bin.py
from year import getYear
print(getYear())  		#就不用再year.getYear()了

也可以

#bin.py
from year import *		#表示导入year.py文件下所有函数
print(getYear())  		#就不用再year.getYear()了

3.2 不同Package下模块的导入

例一:
在这里插入图片描述
bin.py的代码:

from year.month.day.day import getDay
print(getDay())

day.py的代码:

def getDay():
    return 25

运行bin.py输出:
25

3.3、import怎样找到对应的文件

一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。
当使用import语句的时候,Python解释器是怎样找到对应的文件的呢?

import sys
print(sys.path)

import是根据sys.path打印出来的路径依次找的

3.4、动态模块的导入

在这里插入图片描述

  • t.py
def test():
    print("test")
  • bin.py
module_t=__import__("module.t")#返回最顶层模块,这里返回module
print(module_t)
module_t.t.test()				#调用t.py下的test函数

输出:
<module ‘module’ (namespace)>
test

3.5、用importlib动态模块导入

  • bin.py
import importlib
module_t=importlib.import_module("module.t")#返回module.t
print(module_t)
module_t.test()

输出:
<module ‘module.t’ from ‘G:\Program Test\Python\运态模块导入\module\t.py’>
test

4、__ name__

  • __name__如果是在入口文件中,值为main
  • __name__如果是在被调用文件中,值为该文件的文件名
    例:
    在这里插入图片描述
    bin.py的代码:
import year
print(year.getYear())

year.py中的代码:

print("year.py中的__name__:%s" %__name__)
def getYear():
    return 2019

4.1、__ name__在入口文件中运行

year.py作为入口文件直接运行,输出:
year.py中的__name__:main
注:__name_是在入口文件中的所以值为main

4.2、__ name__在被调用文件中运行

year.py被bin.py调用,输出:
year.py中的__name__:year
2019
注:__name_是在被调用文件中的所以值为被调用文件的文件名,year

4.3、__ name__的用法

if __name__=="main":
    print("该文件若是入口文件则__name__值为main")
else:
    print("该文件若是被其他文件调用,__name__为该文件的文件名")

注:程序中加上

if __name__=="main"
如果该文件是入口文件,则其下的程序会被执行
如果该文件是被调用文件,则其下的程序不会被执行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值