模块语法

1、 模块

    模块就是一个包含python定义和声明的文件,文件名就是模块的名字加上.py后缀。换句话说,全部的py文件均可以当作是一个模块。python

    模块名有两个:py文件名, __main__dom

1. 模块的四个通用类别

  • 使用python编写的py文件
  • 已被编译为共享库或者DLL或C或者C++的扩展
  • 包好一组模块的包
  • 使用c编写并链接到python解释器的内置模块

2. 使用模块的好处

  • 能够把代码进行分类
  • 能够实现代码的重用

3. 导入模块时执行的三个动做

  • 先在sys.modules中查看当前导入的模块是否已经被导入。若是已导入,则不会再重复导入,也就不会执行下面两个操做
  • 开辟一片内存空间,在该空间中执行模块中的代码
  • 建立模块的名字。并使用该名称做为该模块在当前模块中引用的名字

使用globals()查看模块的名称空间测试

import random


print(globals())


结果:
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000275FF8DC2B0>, 

'__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/python_我的/day 024 模块的语法/临时/临时.py',

'__cached__': None, 'random': <module 'random' from 'C:\\Python36\\lib\\random.py'>}

 

4. 导入模块的顺序

  • 先引入内置模块
  • 再引入第三方模块
  • 最后引入本身定义的模块

2、导入模块的两种方式

1. import xxx

  • 应用场景:当不肯定要使用模块中哪些功能时。
  • 设置别名:import xxx as xxx

模块在导入的时候会建立其本身的名称空间。因此,在使用模块中的变量的时候通常是不会产生冲突的ui

test模块:

main_person_one = "Jhon"


def foo():
    print(main_person_one)

 

 

# 调用方
import test

main_person_one = "Tom"

test.foo()  # Jhon
print(main_person_one)  # Tom

在模块中使用globalspa

  • global表示把全局的内容引入到局部,但这个全局指的是py文件。换句话说,global指向的是模块内部,并不会改变外部模块的内容
# 模块test中

main_person_one = "Jhon"


def foo():
    global main_person_one
    main_person_one = "Tom"
    print(main_person_one)

 

 

# 调用方
import test

main_person_one = "Linda"

test.foo()  # Tom

print(test.main_person_one)  # Tom
print(main_person_one)  # Linda

2. from xxx import xxx

    使用from xxx import xxx 时,与import方式同样,python也会给模块建立名称空间。但不一样的是,import会把整个模块内容引入过来,而from方式则是部分引入。当一个模块中的内容过多时,能够采用此方式选择性的导入要使用的内容code

  • 应用场景:当肯定要使用模块中哪些功能时
  • 设置别名:from xxx import xxx as xxx
  • from xxx import *:导入全部内容

当从一个模块中引入一个变量时,若是当前文件中出现了重名的变量时,会覆盖掉模块引入的那个变量blog

# test模块:

main_person_one = "Jhon"


def foo():
    print(main_person_one)

 

 

# 调用方
from test import main_person_one, foo

main_person_one = "Tom"

foo()  # Jhon
print(main_person_one)  # Tom

3、修改模块变量的方式(慎用)

  • 方式:模块名.变量名 =  值 , 只能经过import方式修改
  • 后果:当某一调用方对模块变量进行修改后,全部调用方拿到的这个变量的值都发生变化,由于模块只会导入一次,共享名称空间。
# test模块:

main_person_one = "Jhon"


def foo():
    print(main_person_one)

 

# 调用方
import test

test.main_person_one = "Tom"

print(test.main_person_one)  # Tom

4、 __name__

    每一个模块在完成代码编写后,都需对其功能进行测试,此时须要对其编写测试代码。但被调用方导入时不需执行测试代码。此时能够利用__name__过滤掉测试代码的执行内存

    在python中,每一个模块都有本身的__name__,但__name__的值是不定的。当把一个模块做为程序的入口时,此时该模块的__name__是"__main__",而若是把模块导入时,此时模块内部的__name__就是该模块自身的名字io

运行test模块时:编译

# test模块:

def foo():
    print('----test----')


print(__name__)  # __main__

if __name__ == '__main__':
    foo()  # ----test----

运行调用方时:

# 调用方
import test

结果:
test # 即 test模块中,__name__ = test

5、__all__

    在模块中设置__all__, 能够限制模块可容许的导入内容,只对from xxx import * 有效

# test模块
__all__ = ["x", "y"]
x = 2
y = 3
z = 5


def test():
    print("-----test-----")

 

# 调用方
from test import *

print(x)  # 2
print(z)  # NameError: name 'z' is not defined
相关文章
相关标签/搜索