python的import/from 的一些理解

我相信,当大多数人找寻这样的解释时,绝不是想简单的看到为什么使用import或者from。本文是个人对import和from在底层到底做了什么的一些见解。

import

首先定义一个模块 spam.py

a = 37
def foo():
    print(" I'm foo and a is %s " % a)

class Spam(object):
    def testing(self):
        print(" I'm Spam.tesing")

然后定义一个import1_1.py

import spam
print(spam)
print(globals())  #打印当前全局变量的名称

<module 'spam' from 'C:\\...\\import_from\\spam.py'>

{'__name__': '__main__',  '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000024B088DA2B0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/..../import_from/import1.py', '__cached__': None, 'spam': <module 'spam' from 'C:\\....\\import_from\\spam.py'>}

import执行步骤:

     1: 首先创建一个新的命名空间,用以存放模板里定义的所有对象。在spam(模块中)定义的函数和方法在使用global语句时将访问该命名空间。

     2: 其次在新创建的命名空间中执行模块(spam)中所包含的代码

     3: 最后调用函数中名称来引用模块命名空间,这个名称与模块的名称相匹配。

import1_2.py

import spam

a = 10 
print(spam.a)  #调用spam模块内的a
print(spam.foo()) #调用spam模块内的函数foo()
print(a)  #打印当前空间的a
print(globals())

###########
# 37
# I'm foo and a is 37 
# 10
#{'__name__': '__main__', ......, 'spam': <module 'spam' from 'C:\\....\\import_from\\spam.py'>, 'a': 10}

 

 

import2.py

import spam
spam.a = 12

if __name__ =='__main__':
    pass

main.py

import import2
import import1_2

if __name__ == '__main__':
    pass



# 12 #在import2中修改了spam所引用的命名空间中的a的值(大家在尝试一下修改spam.a = 12 为a = 12)
# I'm foo and a is 12 #在import1_2中调用spam所引用命名空间中的函数foo()
# 10  #import1_2中a的值


from 

from1.py

from spam import a 

print(globals())



#{'__name__': '__main__', '__doc__': None,..., 'a': 37}

{'__name__': '__main__', '__doc__': None,..., 'a': 37}
from语句用于将模块中的具体定义加载到当前命名空间。form语句相当于import,但它不会创建一个名称来引用新创建的模块命名空间,而是将对模块中定义的一个或多个对象的引用放到当前命名空间中.

from1_2.py

from spam import a
a = 10  #在本命名空间将a指向一个新的引用
print(a)



# 10

 

另外还有as 别名的用法,自行探索。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SUISUIZHIBO

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

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

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

打赏作者

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

抵扣说明:

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

余额充值