模块与包

一 模块

 1  什么叫做模块:一个py文件就是一个模块

  模块的分类:内置模块,第三方模块和自定义模块

  内置模块:在python产生是就有的模块叫做内置模块,我们只管拿来调用即可

  第三方模块:别人已经定义好了的模块,我们只管下载安装一下就可以调用

  自定义模块:自己定义的模块叫做自定义模块,根据自己设置的调用方式调用

 2 导入模块的顺序:内置模块;第三方模块;自定义模块

  导入模块的规则是:建议不在同一行导入多个模块

  模块的命名空间:模块有模块的命名空间,存在于当前模块的py文件里

     在导入模块的第一时间就会创建模块的命名空间

 3 给模块重命名:as重命名  格式   :from 模块名 import  方法名  as  修改后的名字

1
2
from lianxi import func1 as func_1
func_1()

 

  *:是引用模块下面的所有功能,但是不能重命名   格式  :  from  模块名  import  *

   __all__=[ ]:与*号相通的,中括号里面的内容是啥,*号导入的功能就会相对应的。中括号里面的内容格式必须是字符串的格式。

  导入模块的几种格式:1  import  模块名

            2 from  模块名  import  具体功能名

            3 from  模块名  import  *

1
2
3
# import lianxi
# from lianxi import func
# from lianxi import *

如果导入的模块内容过长,却使用的功能很少,建议使用第二种的调用方式。

  模块与模块之间只要一次导入,就可以多次调用。

1
2
3
4
5
6
7
8
import lianxi
a=333
def func():
    aa=lianxi.time.time()
    lianxi.time.sleep(1)
    print(444)
    print(lianxi.time.time()-aa)
func()

 

 4 sys.modules:查看当前已经导入了的所有模块。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import sys
import lianxi
a=333
def func():
    aa=lianxi.time.time()
    lianxi.time.sleep(1)
    print(444)
    print(lianxi.time.time()-aa)
func()
print(sys.modules)
 
 
 
结果是:
{'builtins': <module 'builtins' (built-in)>, 'sys': <module 'sys' (built-in)>, '_frozen_importlib': <module '_frozen_importlib' (frozen)>, '_imp': <module '_imp' (built-in)>, '_warnings': <module '_warnings' (built-in)>, '_thread': <module '_thread' (built-in)>, '_weakref': <module '_weakref' (built-in)>, '_frozen_importlib_external': <module '_frozen_importlib_external' (frozen)>, '_io': <module 'io' (built-in)>, 'marshal': <module 'marshal' (built-in)>, 'nt': <module 'nt' (built-in)>, 'winreg': <module 'winreg' (built-in)>, 'zipimport': <module 'zipimport' (built-in)>, 'encodings': <module 'encodings' from 'E:\\python3.6\\lib\\encodings\\__init__.py'>, 'codecs': <module 'codecs' from 'E:\\python3.6\\lib\\codecs.py'>, '_codecs': <module '_codecs' (built-in)>, 'encodings.aliases': <module 'encodings.aliases' from 'E:\\python3.6\\lib\\encodings\\aliases.py'>, 'encodings.utf_8': <module 'encodings.utf_8' from 'E:\\python3.6\\lib\\encodings\\utf_8.py'>, '_signal': <module '_signal' (built-in)>, '__main__': <module '__main__' from 'E:/pycharm/pycharm/PyCharm Community Edition 2017.1.3/day27/练习.py'>, 'encodings.latin_1': <module 'encodings.latin_1' from 'E:\\python3.6\\lib\\encodings\\latin_1.py'>, 'io': <module 'io' from 'E:\\python3.6\\lib\\io.py'>, 'abc': <module 'abc' from 'E:\\python3.6\\lib\\abc.py'>, '_weakrefset': <module '_weakrefset' from 'E:\\python3.6\\lib\\_weakrefset.py'>, 'site': <module 'site' from 'E:\\python3.6\\lib\\site.py'>, 'os': <module 'os' from 'E:\\python3.6\\lib\\os.py'>, 'errno': <module 'errno' (built-in)>, 'stat': <module 'stat' from 'E:\\python3.6\\lib\\stat.py'>, '_stat': <module '_stat' (built-in)>, 'ntpath': <module 'ntpath' from 'E:\\python3.6\\lib\\ntpath.py'>, 'genericpath': <module 'genericpath' from 'E:\\python3.6\\lib\\genericpath.py'>, 'os.path': <module 'ntpath' from 'E:\\python3.6\\lib\\ntpath.py'>, '_collections_abc': <module '_collections_abc' from 'E:\\python3.6\\lib\\_collections_abc.py'>, '_sitebuiltins': <module '_sitebuiltins' from 'E:\\python3.6\\lib\\_sitebuiltins.py'>, 'sysconfig': <module 'sysconfig' from 'E:\\python3.6\\lib\\sysconfig.py'>, 'lianxi': <module 'lianxi' from 'E:\\pycharm\\pycharm\\PyCharm Community Edition 2017.1.3\\day27\\lianxi.py'>, 'time': <module 'time' (built-in)>}

  sys.path:查看导入模块的查找路径顺序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import sys
import lianxi
a=333
def func():
    aa=lianxi.time.time()
    lianxi.time.sleep(1)
    print(444)
    print(lianxi.time.time()-aa)
func()
print(sys.path)
 
 
 
 
 
结果:
['E:\\pycharm\\pycharm\\PyCharm Community Edition 2017.1.3\\day27', 'E:\\pycharm\\pycharm2017pjb', 'E:\\pycharm', 'E:\\pycharm\\pycharm\\PyCharm Community Edition 2017.1.3', 'E:\\python3.6\\python36.zip', 'E:\\python3.6\\DLLs', 'E:\\python3.6\\lib', 'E:\\python3.6', 'C:\\Users\\方杰\\AppData\\Roaming\\Python\\Python36\\site-packages', 'E:\\python3.6\\lib\\site-packages']

  导入的模块会被放在内存里,在导入的过程中对模块进行修改是没有作用的

  importlib.reload:在导入的过程中对模块进行修改,会起作用的。

 pyc文件是一个编译好了的文件,只有在导入模块的第一次就会产生,以后在导入模块就不会在产生pyc编译文件。

  python -m:强行产生一个pyc文件。

  5 name:当作脚本调用的时候结果就是__main__

  当name当做导入模块的时候,就是导入的模块名

  建议:调用一个函数的功能,结果和中间结果建议放在(if __name__=='__main__':)里面执行

1
2
3
4
# def func_3(n):
#     print(n)
# if __name__=='__main__':
#     func_3(10)

 6 dir函数:后面功能一个模块,将模块里的所有功能名字打印出来。

  builtins:内置的名字

1
2
3
4
5
6
import builtins
print(dir(builtins))
 
 
结果:
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']

 二  包

 1 什么叫做包:创建的目录里面有init.py文件,并且目录下面有很多的模块,这就叫做包。

    在不同的目录下导入包的格式: 格式1 绝对路径:from  路径.路径.....   import  模块名    

1
2
from glance.api import policy
policy.get()

              导入的文件路径应该在from后面,并且用 .点 分开,导入的模块名跟在import的后面。

                 格式2 相对路径:from  ......目录名    import  模块名

       

  绝对路劲导入模块的好处是:在包的内部外部都能被执行

          坏处是:导入的路径会随着包与文件之间的关系变化而变化

  相对路径导入模块的好处是:一次写好的模块之间的导入关系,不需要关心这个包与文件之间的关系了

          坏处是:只能在这个包的内部调用

 如果自己写的模块与模块之间没有什么联系,就不需要去考虑相对路径和绝对路径了

  如果调用的是一整个包的时候,首先执行的是包下面的Z__init__.py文件。

  

 

  

 

 
分类: 面向对象
posted @ 2017-09-25 08:18  敌说  阅读(133)  评论(0编辑  收藏  举报