python的import/from 的一些理解

  • Post author:
  • Post category:python


我相信,当大多数人找寻这样的解释时,绝不是想简单的看到为什么使用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 别名的用法,自行探索。



版权声明:本文为qq_38407829原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。