Python学习笔记:模块

一时失言乱红尘 2023-07-02 08:24 144阅读 0赞

文章目录

    • 导入模块
      • 代码导入自定义模块
      • 放入指定目录
    • 模块详解
      • 变量__all__
      • help函数
      • 文档
      • 源码

导入模块

通过import将函数从外部导入到程序中:

  1. >>>import math
  2. >>>print(math.sin(0))
  3. 0.0

代码导入自定义模块

任何python程序都可作为模块导入。
编写以下程序,并且保存为hello.py,文件名hello既是模块的名称:

  1. #hello.py
  2. print("hello, world! ")

然后将hello.py所在的目录导入程序中

  1. >>>import sys
  2. >>>sys.path.append('/Users/tangbincheng/Desktop')
  3. >>>import hello
  4. hello, world!

放入指定目录

找出sys的变量path的目录列表:

  1. >>>import sys,pprint
  2. >>>pprint.pprint(sys.path)
  3. ['/Users/tangbincheng/PycharmProjects/untitled1',
  4. '/Users/tangbincheng/PycharmProjects/untitled1',
  5. '/Applications/PyCharm.app/Contents/plugins/python/helpers/pycharm_display',
  6. '/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/python37.zip',
  7. '/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7',
  8. '/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/lib-dynload',
  9. '/Users/tangbincheng/PycharmProjects/untitled1/venv/lib/python3.7/site-packages',
  10. '/Users/tangbincheng/PycharmProjects/untitled1/venv/lib/python3.7/site-packages/setuptools-40.8.0-py3.7.egg',
  11. '/Users/tangbincheng/PycharmProjects/untitled1/venv/lib/python3.7/site-packages/pip-19.0.3-py3.7.egg',
  12. '/Applications/PyCharm.app/Contents/plugins/python/helpers/pycharm_matplotlib_backend']

只需要将模块放置在上述任意文件夹中,所有的程序就都能找到。但site-packages是最佳选择(因为它就是用来放置模块的)

为组织模块,可将其编组为包 (package),包其实就是另一种模块,并且可以包含其他模块。
模块存储在扩展名为.py的 文件中,而包含一个目录。要被python视为包,目录必须文件__init__.py。如果像普通模块一样导入包,文件__init__.py的内容就是包的内容。
要将模块加入包中,只需将模块文件放在包目录中即可。
例如:
要创建一个名为drawing的包,其中包含模块shapes和colors,目录结构如下:

  1. ~/python/
  2. ~/python/drawing/
  3. ~/python/drawing/__init__.py
  4. ~/python/drawing/colors.py
  5. ~/python/drawing/shapes.py

接着导入模块

  1. import drawing #(1)导入drawing包
  2. import drawing.colors #(2)导入drawing包中的模块colors
  3. form drawing import shapes #(3)导入模块shapes模块

执行语句(1)后 ,便可使用目录drawing中的__init__.py的内容,但不能使用模块colors和shapes的内容。
执行(2)后,便可使用模块colors,但只能通过全限定名drawing.colors来使用。
执行(3)后,便可使用简化名shapes来使用模块shapes。

模块详解

要查明模块包含哪些东西,可使用函数dir,可以列出对象的所有属性或者模块的所有函数,类,变量等。
拿标准模块copy举例:

  1. >>>import copy
  2. >>>print(dir(copy))
  3. ['Error', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_copy_dispatch', '_copy_immutable', '_deepcopy_atomic', '_deepcopy_dict', '_deepcopy_dispatch', '_deepcopy_list', '_deepcopy_method', '_deepcopy_tuple', '_keep_alive', '_reconstruct', 'copy', 'deepcopy', 'dispatch_table', 'error']

打印出来的名称列表中,有些是下划线开头的,按照约定,这些意味着不能给外部调用。因此,可以做一下过滤:

  1. >>>print([n for n in dir(copy) if not n.startswith('_')])
  2. ['Error', 'copy', 'deepcopy', 'dispatch_table', 'error']

变量__all__

其实,可以通过调用__all__来将可以将模块提供给用户使用的功能(变量、函数、类 )都打印出来。

  1. >>>print(copy.__all__)
  2. ['Error', 'copy', 'deepcopy']

因此,但是用’from copy import *‘将只能得到__all__中列出的3个函数。
如果要导入dispatch_table,就必须使用from copy import dispatch_table。
变量__all__的作用最主要的作用是:模块中可能包含大量其他程序不需要的变量,函数和类,比较周全的方法就是将他们都过滤掉。
如果不设置__all__,则会在以impory * 的方式导入时,导入所有 不以下划线开头的全局名称。

help函数

标准函数help,可以提供你通常需要的所有信息:

  1. >>>help(copy.copy)
  2. Help on function copy in module copy:
  3. copy(x)
  4. Shallow copy operation on arbitrary Python objects.
  5. See the module's __doc__ string for more info.

文档

文档也是有关模块信息的自然来源:

  1. >>>print(copy.__doc__)
  2. Generic (shallow and deep) copying operations.
  3. Interface summary:
  4. import copy
  5. x = copy.copy(y) # make a shallow copy of y
  6. x = copy.deepcopy(y) # make a deep copy of y
  7. For module specific errors, copy.Error is raised.
  8. The difference between shallow and deep copying is only relevant for
  9. compound objects (objects that contain other objects, like lists or
  10. class instances).
  11. ....

源码

如果你要阅读copy的代码,可以通过__file__

  1. >>>print(copy.__file__)
  2. /Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/copy.py

发表评论

表情:
评论列表 (有 0 条评论,144人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Python3学习笔记模块

    模块 Python代码以.py文件形式保存。而每个.py文件都可以看作是一个模块。当一个模块调用另一个模块时,便需要import语句。 在此前的章节中,我们已看到imp