• Python 学习笔记 11.模块(Module)


    转载自:http://www.xwy2.com/article.asp?id=120

    Python 的 Module 更像 Object Pascal Unit,和 C# namespace 那种纯粹作为编译器名称识别符不同,Module 本身就是一种类型。

    Code
    >>>>>> import types
    >>>>>> types.ModuleType
    <type 'module'>
    >>>>>> type(types)
    <type 'module'>
    >>>>>>

    我们可以在 Module 中定义变量、方法、类以及其他执行代码。

    Code
    >>>>>> i = 15
    >>>>>> def test():
    pass

    >>>>>> class Class1:
    pass

    >>>>>> print "Hello Python"
    Hello Python

    通过 __name__ 可以判断当前 module 是被 import 还是 execute。

    Code
    >>>>>> if __name__=="__main__":
    print "Execute"
    else:
    print "Import"


    Execute
    >>>>>>

    可以使用 dir() 方法查看 module 的成员。

    Code
    >>>>>> import sys
    >>>>>> dir(sys)
    [
    '__displayhook__', '__doc__', '__excepthook__', '__name__', '__stderr__', '__stdin__', '__stdout__', '_current_frames', '_getframe', 'api_version', 'argv', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dllhandle', 'exc_clear', 'exc_info', 'exc_traceback', 'exc_type', 'exc_value', 'excepthook', 'exec_prefix', 'executable', 'exit', 'getcheckinterval', 'getdefaultencoding', 'getfilesystemencoding', 'getrecursionlimit', 'getrefcount', 'getwindowsversion', 'hexversion', 'maxint', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'setcheckinterval', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions', 'winver']
    >>>>>> dir()
    [
    'Class1', '__builtins__', '__doc__', '__name__', 'i', 'sys', 'test']

    作为引入机制,我们可以用两种方法来导入其他 module 成员。

    Code
    >>>>>> import sys
    >>>>>> sys.version
    '2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)]'
    >>>>>> from sys import version
    >>>>>> version
    '2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)]'
    >>>>>> from sys import *
    >>>>>> winver
    '2.5'
    >>>>>>

    除了使用 import 关键字以外,我们还可以使用内建函数 __import__() 来导入 module。两者的区别是,import 后面跟的必须是一个类型(type),而__import__() 的参数是一个字符串,这个字符串可能来自配置文件,也可能是某个表达式计算结果,这显然为我们提供了更大的灵活性。

    Code
    >>>>>> m1=__import__("sys")
    >>>>>> type(m1)
    <type 'module'>
    >>>>>> m1.winver
    '2.5'
    >>>>>>

    使用 import 导入 module 时,Python 会将要导入的 module 编译成字节码,这种二进制文件(.pyc)虽然没有提高执行速度,但能加快装载速度。我们还可以调用相关方法来完成编译行为。

    Code
    >>>>>> import py_compile
    >>>>>> py_compile.compile("e:\\Users\\py\\hello.py") # 编译单个 .py 文件
    >>>>>> import compileall
    >>>>>> compileall.compile_dir("e:\\Users\\py") # 编译指定目录下的所有 .py 文件
    Listing e:\Users\py
    1
    >>>>>>

    Python 通过 PYTHONPATH 环境变量来查找 module,我们可以使用 sys.path 来查看或添加新的路径。

    Code
    >>>>>> sys.path
    [
    'D:\\Python25\\Lib\\idlelib', 'C:\\WINDOWS\\system32\\python25.zip', 'D:\\Python25\\DLLs', 'D:\\Python25\\lib', 'D:\\Python25\\lib\\plat-win', 'D:\\Python25\\lib\\lib-tk', 'D:\\Python25', 'D:\\Python25\\lib\\site-packages']
    >>>>>> sys.path.append("e:\\Users\\py")
    >>>>>> sys.path
    [
    'D:\\Python25\\Lib\\idlelib', 'C:\\WINDOWS\\system32\\python25.zip', 'D:\\Python25\\DLLs', 'D:\\Python25\\lib', 'D:\\Python25\\lib\\plat-win', 'D:\\Python25\\lib\\lib-tk', 'D:\\Python25', 'D:\\Python25\\lib\\site-packages', 'e:\\Users\\py']
    >>>>>>

    Package

    我们可以将多个 module 组合成一个 package。

    方法很简单:
    1. 在 Python\Lib 或者其他可以被搜索到的路径下创建一个子文件夹,文件夹名就是包名称。
    2. 将所有需要加入的 module 放到该子文件夹中。
    3. 创建一个包含代码或为空的 __init__.py 文件。在第一次 import 该包时,该文件会被自动执行。

    在 import 该包的时候,需要添加包名称前缀。

    Code
    >>>>>> import mypackage
    >>>>>> import mypackage.module1
    >>>>>> from mypackage import *
    >>>>>> from mypackage.module1 import *
  • 相关阅读:
    不同数据类型的取值范围
    反正切函数求圆周率 atan
    HDOJ 1106
    HDOJ 1596
    HDOJ 1026 dfs路径保存
    qsort用法总结
    HDOJ 2088
    HDOJ 1878 欧拉回路 nyoj 42一笔画问题
    HDOJ 1863 prim算法 HDOJ 1879
    HDOj 1010 DFS优化
  • 原文地址:https://www.cnblogs.com/sislcb/p/1285996.html
Copyright © 2020-2023  润新知