py文件的2种用途以及2种导入模块的方式
foo.py文件:
# **************************************************************************
# Python学习
# **************************************************************************
# ** 所属主题: 模块
# ** 所属分层: foo
# ** 功能描述: foo
# ** 创 建 者: 陈红伟
# ** 创建日期: 2021/4/17 11:28 下午
# **************************************************************************
# ** 修改日期 修改人 修改内容
# ** 2021/4/17 陈红伟 新增学习内容代码
# **************************************************************************
"""
该文件只是在学习模块的时候需要
"""
def add(x,y):
return x+y
x = 1
def f():
print(x)
print(__name__)
# __main__
def get():
return x
def change():
global x
x= 10
return x
# **************************************************************************
# Python学习
# **************************************************************************
# ** 所属主题: 模块
# ** 所属分层: 41 py文件的几种用途、导入模块的两种方式
# ** 功能描述: 41 py文件的几种用途、导入模块的两种方式
# ** 创 建 者: 陈红伟
# ** 创建日期: 2021/4/18 12:19 上午
# **************************************************************************
# ** 修改日期 修改人 修改内容
# ** 2021/4/18 陈红伟 新增学习内容代码
# **************************************************************************
"""
py文件的用途:
1、当成模块导入 eg:import foo
2、当成程序执行 eg:直接运行.py文件
"""
# 怎么判断一个py文件是被当成模块还是程序运行呢?
# 在py文件中使用 __name__ 来判断
# 如果是当成程序运行:
print(__name__) # __main__
# 如果是当成模块运行:
# import foo
# # 这里会直接打印foo,因为foo中写了代码: print(__name__)
"""
导入模块的方式:
1、直接import 模块名
2、from 模块名 import 模块内对象
"""
# # 第一种,直接import 模块名: (这里演示要注释掉前面导入过foo模块的代码,不然会有影响)
# import foo
# x=999
# print(x) # 999
# print(foo.x) # 1
# print(foo.get()) # 1
# print(foo.change()) # 10
# print(foo.get()) # 10
# print(x) # 999
# print(foo.x) # 10 直接导入的方式(import foo):在当前文件中产生的有一个名字foo,该名字指向步骤2中产生的名称空间,所以是打印10, 而不是1
# 第二种,from 模块名 import 模块内对象 (这里演示要注释掉导入过foo模块的代码,不然会有影响)
from foo import x as f # f=模块foo中x的值(此处是1)的内存地址
from foo import get
from foo import change
x = 8888
print(x) # 8888
print(f) # 1
print(get()) # 1
print(change()) # 10
print(get()) # 10
print(f) # 1 ⚠️特别注意⚠️特别注意⚠️:这里是返回1 , 因为f是当前文件的名称空间的值,f=模块foo中x的值(此处是1)的内存地址
# 那如果想要获得foo中change后的x,可以重新导入一次即可
from foo import x
print(x) # 10,可以看到这里结果为10
"""
根据上述结果得到结论,两种导入方式的异同点:
相同点:
步骤1、执行被导入模块的文件(foo.py)
步骤2、产生被导入模块(foo.py)的名称空间,将foo.py运行过程中产生的名字都丢到foo的名称空间中
异同点:(前两个步骤相同)
步骤3:
直接导入的方式(import foo):在当前文件中产生的一个模块名(foo),该名字指向「步骤2」中产生的名称空间。所以方法1中最后print(foo.x)输出的是10
采用第二种方式(from 模块名 import 模块内对象):在当前文件中产生的一个模块名(foo),该名字指向「当前文件」的名称空间。所以方法2中最后print(f)输出的是1,因为调用的是当前名称空间的变量
[ps:那如果想要获得foo中change后的x,可以重新导入一次即可]
"""