python's twenty eithth day for me 模块和包

模块:

  什么是模块:

    常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀,但其实import加载的模块分为四个通用类别:

    1,使用python编写的代码(.py文件)

    2,以被编译为共享库或DLL的C或C++扩展。

    3,包好一组模块的包。

    4,使用C编写并链接到python解释器的内置模块。

import:

  import 模块名:

    1,导入一个模块。

    2,相当于这个模块从上到下一次被执行了。

    3,同一个模块不会被多次导入。

import my_module
# 使用模块中的属性或方法时:模块名.方法名()  模块名.属性名
print(my_module.money)   # 100  # 使用模块中的属性名或方法名。
my_module.func()    # 1

  1,import my_module 模块,首先创建一个属于my_module的内存空间

  2,加载my_module模块中的所有代码

  3,将my_module模块中的名字方法放在my_module的命名空间中

import...as...:将...模块导入命名为...

import my_module as m
print(m.money)  # 100
m.func()    # 1
inp = input('json or pickle >>>')
if inp == 'json':
    import json as m
elif inp == 'pickle':
    import pickle as m
dic = {'k':'v'}
print(m.dumps(dic))
print(m.loads(m.dumps(dic)))

import 可一次导入多个模块:不推荐使用。

import hashlib,json,pickl

python PEP8规范:

  1,每一行 import 应该导入一个模块。

  2,如果不是必要的需求,所有的模块都应该在文件的顶端导入。

  3,关于导入模块的顺序,先导入内置的,再导入扩展,最后导入自定义。

导入模块是将模块放入到 sys.modules 中,使用变量的时候看的是全局命名空间globals().

import sys
import my_module
print(globals())
print(sys.modules)

from 模块名 import 方法名或者属性名:

  1,导入的名字直接属于全局,但是指向模块的名字所在的内存空间

  2,导入的名字如果是是函数或者方法,引用了全局的变量,仍然使用模块中的变量

  3,导入的名字和全局的名字是一样的,谁最后抢占到就是谁的

from my_module import money,func
# 这种导入就不能使用模块名.属性名或方法名了,否则会报错。
# 这样导入的属性或者方法名就属于全局变量,可直接调用。
print(money)    # 100  此时是模块局部中的money
money = 999
print(money)    # 999   先加载模块中的money,然后加载本全局变量中的money会将模块中的覆盖
fu

nc() # 100 # 用到的变量仍然是局部的变量。

from 模块 import * : 默认会把模块中所有名字都导入到全局:

from my_module import *
print(money)
func()

* 和 __all__配合使用:在被导入模块中如果有__all__ = [‘属性名’,‘方法名’],则只能调用__all__列表中拥有的名字。其他的都不可调用。

原文地址:https://www.cnblogs.com/stfei/p/8944731.html