Python包模块化调用方式详解

                           作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

  一般来说,编程语言中,库、包、模块是同一种概念,是代码组织方式。 Python中只有一种模块对象类型,但是为了模块化组织模块的便利,提供了"包"的概念。

  模块module,指的是Python的源代码文件。 包package,指的是模块组织在一起的和包名同名的目录及其相关文件。

一.导入语句

 #!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie import os
import pathlib as p1 #倒入模块使用别名
from os.path import exists #加载、初始化os、os.path模块,exists加入本地名词空间并绑定 """
总结
找到from子句中指定的模块,加载并初始化它(注意不是导入) 对于import子句后的名称
1>.先查from子句导入的模块是否具有该名称的属性
2>.如果不是,则尝试导入该名称的子模块
3>.还没有找到,则抛出ImportError异常
4>.这个名称保存到本地名词空间中,如果有as子句,则使用as子句后的名称
""" if exists('o:/t'):
print('Found')
else:
print('Not Found')
print(dir())
print(exists) # 4种方式获得同一个对象exist
print(os.path.exists)
print(exists)
print(os.path.__dict__['exists']) # 字符串
print(getattr(os.path, 'exists')) # 字符串 print(p1)
print(p1.Path,id(p1.Path))
print(dir())
Not Found
['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'exists', 'os', 'p1']
<function exists at 0x1006f9d08>
<function exists at 0x1006f9d08>
<function exists at 0x1006f9d08>
<function exists at 0x1006f9d08>
<function exists at 0x1006f9d08>
<module 'pathlib' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/pathlib.py'>
<class 'pathlib.Path'> 4328656856
['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'exists', 'os', 'p1']

以上代码执行结果戳这里

二.自定义模块

1>.自定义模块命名规范

  (1)模块名就是文件名,"*.py"文件就是一个模块
  (2)模块名必须符合标识符的要求,是非数字开头的字母、数字和下划线的组合。test-module.py这样的文件名不能作为模块名。也不要使用中文。
  (3)不要使用系统模块名来避免冲突,除非你明确知道这个模块名的用途
  (4)通常模块名为全小写,下划线来分割

2>.案例演示

 #!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie class Point:
def __init__(self,x,y):
self.x = x
self.y = y def showModule(self):
print(1,self.__module__,self)
print(2,self.__dict__)
print(3,self.__class__.__dict__)
print(4,self.__class__.__name__) def __repr__(self):
return "Point(x = {},y = {})".format(self.x,self.y) p = Point(10,20)
print(p)

test01.py

#!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie import test01 a = test01.Point(300,1000)
a.showModule()

test02.py

 #!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie from test01 import Point as p1 b = p1(20,30)
b.showModule()

test03.py

三.模块搜索顺序

 #!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie import sys """
使用 sys.path 查看搜索顺序,路径顺序为
1.程序主目录,程序运行的主程序脚本所在的目录
2.PYTHONPATH目录,环境变量PYTHONPATH设置的目录也是搜索模块的路径 3. 标准库目录,Python自带的库模块所在目录 温馨提示:
sys.path可以被修改,增加新的目录
"""
print(*sys.path,sep="\n")
/yinzhengjie/python/devops/python基础/08.模块化
/yinzhengjie/python/devops
/Applications/PyCharm.app/Contents/helpers/pycharm_display
/Library/Frameworks/Python.framework/Versions/3.7/lib/python37.zip
/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7
/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload
/yinzhengjie/python/devops/venv/lib/python3.7/site-packages
/yinzhengjie/python/devops/venv/lib/python3.7/site-packages/setuptools-40.8.0-py3.7.egg
/yinzhengjie/python/devops/venv/lib/python3.7/site-packages/pip-19.0.3-py3.7.egg
/Applications/PyCharm.app/Contents/helpers/pycharm_matplotlib_backend

以上代码输出结果戳这里

四.模块的重复导入

 #!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie import sys
print(sys.modules) #所有加载的模块都会记录在"sys.modules"中,sys.modules是存储已经加载过的所有模块的字典。 import test01 #第一次加载"test01"模块 print("local module")
print(sys.modules) #打印"sys.modules"可以看到os,os.path都已经加载了。 import test01
import test01 #我们多次对"test01"模块进行倒入,然而并不会产生重复倒入对现象。 print(sys.modules)
{'sys': <module 'sys' (built-in)>, 'builtins': <module 'builtins' (built-in)>, '_frozen_importlib': <module '_frozen_importlib' (frozen)>, '_imp': <module '_imp' (built-in)>, '_thread': <module '_thread' (built-in)>, '_warnings': <module '_warnings' (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)>, 'posix': <module 'posix' (built-in)>, 'zipimport': <module 'zipimport' (built-in)>, 'encodings': <module 'encodings' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/encodings/__init__.py'>, 'codecs': <module 'codecs' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/codecs.py'>, '_codecs': <module '_codecs' (built-in)>, 'encodings.aliases': <module 'encodings.aliases' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/encodings/aliases.py'>, 'encodings.utf_8': <module 'encodings.utf_8' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/encodings/utf_8.py'>, '_signal': <module '_signal' (built-in)>, '__main__': <module '__main__' from '/yinzhengjie/python/devops/python基础/08.模块化/test02.py'>, 'encodings.latin_1': <module 'encodings.latin_1' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/encodings/latin_1.py'>, 'io': <module 'io' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/io.py'>, 'abc': <module 'abc' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/abc.py'>, '_weakrefset': <module '_weakrefset' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_weakrefset.py'>, 'site': <module 'site' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site.py'>, 'os': <module 'os' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py'>, 'errno': <module 'errno' (built-in)>, 'stat': <module 'stat' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/stat.py'>, '_stat': <module '_stat' (built-in)>, 'posixpath': <module 'posixpath' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/posixpath.py'>, 'genericpath': <module 'genericpath' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/genericpath.py'>, 'os.path': <module 'posixpath' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/posixpath.py'>, '_collections_abc': <module '_collections_abc' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_collections_abc.py'>, '_sitebuiltins': <module '_sitebuiltins' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_sitebuiltins.py'>, '_bootlocale': <module '_bootlocale' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_bootlocale.py'>, '_locale': <module '_locale' (built-in)>, 'encodings.cp437': <module 'encodings.cp437' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/encodings/cp437.py'>, 'sitecustomize': <module 'sitecustomize' from '/Applications/PyCharm.app/Contents/helpers/pycharm_matplotlib_backend/sitecustomize.py'>}
Point(x = 10,y = 20)
local module
{'sys': <module 'sys' (built-in)>, 'builtins': <module 'builtins' (built-in)>, '_frozen_importlib': <module '_frozen_importlib' (frozen)>, '_imp': <module '_imp' (built-in)>, '_thread': <module '_thread' (built-in)>, '_warnings': <module '_warnings' (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)>, 'posix': <module 'posix' (built-in)>, 'zipimport': <module 'zipimport' (built-in)>, 'encodings': <module 'encodings' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/encodings/__init__.py'>, 'codecs': <module 'codecs' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/codecs.py'>, '_codecs': <module '_codecs' (built-in)>, 'encodings.aliases': <module 'encodings.aliases' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/encodings/aliases.py'>, 'encodings.utf_8': <module 'encodings.utf_8' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/encodings/utf_8.py'>, '_signal': <module '_signal' (built-in)>, '__main__': <module '__main__' from '/yinzhengjie/python/devops/python基础/08.模块化/test02.py'>, 'encodings.latin_1': <module 'encodings.latin_1' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/encodings/latin_1.py'>, 'io': <module 'io' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/io.py'>, 'abc': <module 'abc' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/abc.py'>, '_weakrefset': <module '_weakrefset' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_weakrefset.py'>, 'site': <module 'site' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site.py'>, 'os': <module 'os' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py'>, 'errno': <module 'errno' (built-in)>, 'stat': <module 'stat' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/stat.py'>, '_stat': <module '_stat' (built-in)>, 'posixpath': <module 'posixpath' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/posixpath.py'>, 'genericpath': <module 'genericpath' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/genericpath.py'>, 'os.path': <module 'posixpath' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/posixpath.py'>, '_collections_abc': <module '_collections_abc' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_collections_abc.py'>, '_sitebuiltins': <module '_sitebuiltins' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_sitebuiltins.py'>, '_bootlocale': <module '_bootlocale' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_bootlocale.py'>, '_locale': <module '_locale' (built-in)>, 'encodings.cp437': <module 'encodings.cp437' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/encodings/cp437.py'>, 'sitecustomize': <module 'sitecustomize' from '/Applications/PyCharm.app/Contents/helpers/pycharm_matplotlib_backend/sitecustomize.py'>, 'test01': <module 'test01' from '/yinzhengjie/python/devops/python基础/08.模块化/test01.py'>}
{'sys': <module 'sys' (built-in)>, 'builtins': <module 'builtins' (built-in)>, '_frozen_importlib': <module '_frozen_importlib' (frozen)>, '_imp': <module '_imp' (built-in)>, '_thread': <module '_thread' (built-in)>, '_warnings': <module '_warnings' (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)>, 'posix': <module 'posix' (built-in)>, 'zipimport': <module 'zipimport' (built-in)>, 'encodings': <module 'encodings' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/encodings/__init__.py'>, 'codecs': <module 'codecs' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/codecs.py'>, '_codecs': <module '_codecs' (built-in)>, 'encodings.aliases': <module 'encodings.aliases' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/encodings/aliases.py'>, 'encodings.utf_8': <module 'encodings.utf_8' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/encodings/utf_8.py'>, '_signal': <module '_signal' (built-in)>, '__main__': <module '__main__' from '/yinzhengjie/python/devops/python基础/08.模块化/test02.py'>, 'encodings.latin_1': <module 'encodings.latin_1' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/encodings/latin_1.py'>, 'io': <module 'io' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/io.py'>, 'abc': <module 'abc' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/abc.py'>, '_weakrefset': <module '_weakrefset' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_weakrefset.py'>, 'site': <module 'site' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site.py'>, 'os': <module 'os' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py'>, 'errno': <module 'errno' (built-in)>, 'stat': <module 'stat' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/stat.py'>, '_stat': <module '_stat' (built-in)>, 'posixpath': <module 'posixpath' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/posixpath.py'>, 'genericpath': <module 'genericpath' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/genericpath.py'>, 'os.path': <module 'posixpath' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/posixpath.py'>, '_collections_abc': <module '_collections_abc' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_collections_abc.py'>, '_sitebuiltins': <module '_sitebuiltins' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_sitebuiltins.py'>, '_bootlocale': <module '_bootlocale' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_bootlocale.py'>, '_locale': <module '_locale' (built-in)>, 'encodings.cp437': <module 'encodings.cp437' from '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/encodings/cp437.py'>, 'sitecustomize': <module 'sitecustomize' from '/Applications/PyCharm.app/Contents/helpers/pycharm_matplotlib_backend/sitecustomize.py'>, 'test01': <module 'test01' from '/yinzhengjie/python/devops/python基础/08.模块化/test01.py'>}

以上代码执行结果戳这里

五.模块运行

1>.if __name__ == '__main__' 的用途

 #!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie class Point:
def __init__(self,x,y):
self.x = x
self.y = y def showModule(self):
print(1,self.__module__,self)
print(2,self.__dict__)
print(3,self.__class__.__dict__)
print(4,self.__class__.__name__) def __repr__(self):
return "Point(x = {},y = {})".format(self.x,self.y) p = Point(10,20)
print(p)

test01.py文件内容

#!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie import test01 """
if __name__ == '__main__': 用途
1.本模块的功能测试 对于非主模块,测试本模块内的函数、类
2.避免主模块变更的副作用 顶层代码,没有封装,主模块使用时没有问题。但是,一旦有了新的主模块,老的主模块成了被导入模块, 由于原来代码没有封装,一并执行了。
"""
if __name__ == '__main__':
print("in __main__")
else:
print("in imported module")
Point(x = 10,y = 20)
in __main__

以上代码输出结果戳这里

2>.模块的属性

 #!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie import test01 as t1 """
模块的属性如下:
__file__
字符串,源文件路径
__cached__
字符串,编译后的字节码文件路径
__spec__
显示模块的规范
__name__
模块名
__package__
当模块是包,同 __name__ ;否则,可以设置为顶级模块的空字符串
""" for k,v in t1.__dict__.items():
print(k,str(v)[:80]) print(dir(t1)) for name in dir(t1):
print(getattr(t1,name))
Point(x = 10,y = 20)
__name__ test01
__doc__ None
__package__
__loader__ <_frozen_importlib_external.SourceFileLoader object at 0x1021610b8>
__spec__ ModuleSpec(name='test01', loader=<_frozen_importlib_external.SourceFileLoader ob
__file__ /yinzhengjie/python/devops/python基础/08.模块化/test01.py
__cached__ /yinzhengjie/python/devops/python基础/08.模块化/__pycache__/test01.cpython-37.pyc
__builtins__ {'__name__': 'builtins', '__doc__': "Built-in functions, exceptions, and other o
Point <class 'test01.Point'>
p Point(x = 10,y = 20)
['Point', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'p']
<class 'test01.Point'>
{'__name__': 'builtins', '__doc__': "Built-in functions, exceptions, and other objects.\n\nNoteworthy: None is the `nil' object; Ellipsis represents `...' in slices.", '__package__': '', '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': ModuleSpec(name='builtins', loader=<class '_frozen_importlib.BuiltinImporter'>), '__build_class__': <built-in function __build_class__>, '__import__': <built-in function __import__>, 'abs': <built-in function abs>, 'all': <built-in function all>, 'any': <built-in function any>, 'ascii': <built-in function ascii>, 'bin': <built-in function bin>, 'callable': <built-in function callable>, 'chr': <built-in function chr>, 'compile': <built-in function compile>, 'delattr': <built-in function delattr>, 'dir': <built-in function dir>, 'divmod': <built-in function divmod>, 'eval': <built-in function eval>, 'exec': <built-in function exec>, 'format': <built-in function format>, 'getattr': <built-in function getattr>, 'globals': <built-in function globals>, 'hasattr': <built-in function hasattr>, 'hash': <built-in function hash>, 'hex': <built-in function hex>, 'id': <built-in function id>, 'input': <built-in function input>, 'isinstance': <built-in function isinstance>, 'issubclass': <built-in function issubclass>, 'iter': <built-in function iter>, 'len': <built-in function len>, 'locals': <built-in function locals>, 'max': <built-in function max>, 'min': <built-in function min>, 'next': <built-in function next>, 'oct': <built-in function oct>, 'ord': <built-in function ord>, 'pow': <built-in function pow>, 'print': <built-in function print>, 'repr': <built-in function repr>, 'round': <built-in function round>, 'setattr': <built-in function setattr>, 'sorted': <built-in function sorted>, 'sum': <built-in function sum>, 'vars': <built-in function vars>, 'None': None, 'Ellipsis': Ellipsis, 'NotImplemented': NotImplemented, 'False': False, 'True': True, 'bool': <class 'bool'>, 'memoryview': <class 'memoryview'>, 'bytearray': <class 'bytearray'>, 'bytes': <class 'bytes'>, 'classmethod': <class 'classmethod'>, 'complex': <class 'complex'>, 'dict': <class 'dict'>, 'enumerate': <class 'enumerate'>, 'filter': <class 'filter'>, 'float': <class 'float'>, 'frozenset': <class 'frozenset'>, 'property': <class 'property'>, 'int': <class 'int'>, 'list': <class 'list'>, 'map': <class 'map'>, 'object': <class 'object'>, 'range': <class 'range'>, 'reversed': <class 'reversed'>, 'set': <class 'set'>, 'slice': <class 'slice'>, 'staticmethod': <class 'staticmethod'>, 'str': <class 'str'>, 'super': <class 'super'>, 'tuple': <class 'tuple'>, 'type': <class 'type'>, 'zip': <class 'zip'>, '__debug__': True, 'BaseException': <class 'BaseException'>, 'Exception': <class 'Exception'>, 'TypeError': <class 'TypeError'>, 'StopAsyncIteration': <class 'StopAsyncIteration'>, 'StopIteration': <class 'StopIteration'>, 'GeneratorExit': <class 'GeneratorExit'>, 'SystemExit': <class 'SystemExit'>, 'KeyboardInterrupt': <class 'KeyboardInterrupt'>, 'ImportError': <class 'ImportError'>, 'ModuleNotFoundError': <class 'ModuleNotFoundError'>, 'OSError': <class 'OSError'>, 'EnvironmentError': <class 'OSError'>, 'IOError': <class 'OSError'>, 'EOFError': <class 'EOFError'>, 'RuntimeError': <class 'RuntimeError'>, 'RecursionError': <class 'RecursionError'>, 'NotImplementedError': <class 'NotImplementedError'>, 'NameError': <class 'NameError'>, 'UnboundLocalError': <class 'UnboundLocalError'>, 'AttributeError': <class 'AttributeError'>, 'SyntaxError': <class 'SyntaxError'>, 'IndentationError': <class 'IndentationError'>, 'TabError': <class 'TabError'>, 'LookupError': <class 'LookupError'>, 'IndexError': <class 'IndexError'>, 'KeyError': <class 'KeyError'>, 'ValueError': <class 'ValueError'>, 'UnicodeError': <class 'UnicodeError'>, 'UnicodeEncodeError': <class 'UnicodeEncodeError'>, 'UnicodeDecodeError': <class 'UnicodeDecodeError'>, 'UnicodeTranslateError': <class 'UnicodeTranslateError'>, 'AssertionError': <class 'AssertionError'>, 'ArithmeticError': <class 'ArithmeticError'>, 'FloatingPointError': <class 'FloatingPointError'>, 'OverflowError': <class 'OverflowError'>, 'ZeroDivisionError': <class 'ZeroDivisionError'>, 'SystemError': <class 'SystemError'>, 'ReferenceError': <class 'ReferenceError'>, 'MemoryError': <class 'MemoryError'>, 'BufferError': <class 'BufferError'>, 'Warning': <class 'Warning'>, 'UserWarning': <class 'UserWarning'>, 'DeprecationWarning': <class 'DeprecationWarning'>, 'PendingDeprecationWarning': <class 'PendingDeprecationWarning'>, 'SyntaxWarning': <class 'SyntaxWarning'>, 'RuntimeWarning': <class 'RuntimeWarning'>, 'FutureWarning': <class 'FutureWarning'>, 'ImportWarning': <class 'ImportWarning'>, 'UnicodeWarning': <class 'UnicodeWarning'>, 'BytesWarning': <class 'BytesWarning'>, 'ResourceWarning': <class 'ResourceWarning'>, 'ConnectionError': <class 'ConnectionError'>, 'BlockingIOError': <class 'BlockingIOError'>, 'BrokenPipeError': <class 'BrokenPipeError'>, 'ChildProcessError': <class 'ChildProcessError'>, 'ConnectionAbortedError': <class 'ConnectionAbortedError'>, 'ConnectionRefusedError': <class 'ConnectionRefusedError'>, 'ConnectionResetError': <class 'ConnectionResetError'>, 'FileExistsError': <class 'FileExistsError'>, 'FileNotFoundError': <class 'FileNotFoundError'>, 'IsADirectoryError': <class 'IsADirectoryError'>, 'NotADirectoryError': <class 'NotADirectoryError'>, 'InterruptedError': <class 'InterruptedError'>, 'PermissionError': <class 'PermissionError'>, 'ProcessLookupError': <class 'ProcessLookupError'>, 'TimeoutError': <class 'TimeoutError'>, 'open': <built-in function open>, 'quit': Use quit() or Ctrl-D (i.e. EOF) to exit, 'exit': Use exit() or Ctrl-D (i.e. EOF) to exit, 'copyright': Copyright (c) 2001-2017 Python Software Foundation.
All Rights Reserved. Copyright (c) 2000 BeOpen.com.
All Rights Reserved. Copyright (c) 1995-2001 Corporation for National Research Initiatives.
All Rights Reserved. Copyright (c) 1991-1995 Stichting Mathematisch Centrum, Amsterdam.
All Rights Reserved., 'credits': Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
for supporting Python development. See www.python.org for more information., 'license': Type license() to see the full license text, 'help': Type help() for interactive help, or help(object) for help about object.}
/yinzhengjie/python/devops/python基础/08.模块化/__pycache__/test01.cpython-37.pyc
None
/yinzhengjie/python/devops/python基础/08.模块化/test01.py
<_frozen_importlib_external.SourceFileLoader object at 0x1021610b8>
test01 ModuleSpec(name='test01', loader=<_frozen_importlib_external.SourceFileLoader object at 0x1021610b8>, origin='/yinzhengjie/python/devops/python基础/08.模块化/test01.py')
Point(x = 10,y = 20)

以上代码输出结果戳这里

六.包

  pycharm中,创建Directory和创建Python package不同,前者是创建普通的目录,后者是创建一个带有 __init__.py 文件的目录即包。

  Python中,目录可以作为模块,这就是包,不过代码需要写在该目录下 __init__.py 中。

七.子模块

1>.包目录下的py文件,子目录都是其子模块,目录结构如下图所示

2>.在上图的包中“setup.py”文件编写测试代码

 #!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie import hdfs
import mapreduce.yarn
from mapreduce import yarn
from hdfs.namenode import NameNode print(__file__) #打印当前文件名称 print("{0}我是分割线{0}".format("*" * 20)) print(dir()) print("{0}我是分割线{0}".format("*" * 20)) import sys
print(sorted(filter(lambda x:x.startswith("m"),sys.modules.keys()))) 
in hadoop.hdfs
in hadoop.yarn
in haoop.hdfs.namenode
/yinzhengjie/python/devops/python基础/08.模块化/hadoop/setup.py
********************我是分割线********************
['NameNode', '__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'hdfs', 'mapreduce', 'yarn']
********************我是分割线********************
['mapreduce', 'mapreduce.yarn', 'marshal']

以上代码输出结果戳这里

 

八.模块和包的总结

  包能够更好的组织模块,尤其是大的模块,其代码行数很多,可以把它拆分成很多子模块,便于使用某些功能就加载相应的子模块。

  包目录中 __init__.py 是在包第一次导入的时候就会执行,内容可以为空,也可以是用于该包初始化工作的代码, 最好不要删除它(低版本不可删除 __init__.py 文件) 导入子模块一定会加载父模块,但是导入父模块一定不会导入子模块

  包目录之间只能使用.点号作为间隔符,表示模块及其子模块的层级关系

  模块也是封装,如同类、函数,不过它能够封装变量、类、函数。   模块就是命名空间,其内部的顶层标识符,都是它的属性,可以通过 __dict__ 或dir(module)查看。   包也是模块,但模块不一定是包,包是特殊的模块,是一种组织方式,它包含 __path__ 属性
from json import encoder 之后, json.dump 函数用不了,为什么? 

import json.encoder 之后呢? json.dump 函数能用吗?

原因是:
  from json import encoder之后,当前名词空间没有json,但是json模块已经加载过了,没有json的引用, 无法使用dump函数。
  import json.encoder也加载json模块,但是当前名词空间有json,因此可以调用json.dump。

扩展小知识(使劲戳这里)

九.绝对导入和相对导入

1>.绝对导入

  在import语句或者from导入模块,模块名称最前面不是以.点开头的 

  绝对导入总是去模块搜索路径中找,当然会查看一下该模块是否已经加载

2>.相对导入

  只在包内使用,且只能用在from语句中,相对导入,更像是目录操作。

  使用.点号,表示当前目录内 

  ..表示上一级目录 不要在顶层模块中使用相对导入

  举例a.b.c模块,a、b是目录,c是模块c.py,c的代码中,使用 from . import d # imports a.b.d
    from .. import e # imports a.e
    from .d import x # a.b.d.x
    from ..e import x # a.e.x
    ... 三点表示上上一级   温馨提示:
   一旦一个模块中使用相对导入,就不可以作为主模块运行了。
  测试一下有相对导入语句的模块,能够直接运行吗?答案是否定的,很好理解,使用相对导入的模块就是为了内部互相的引用资源的,不是为了直接运行的,对于包来说,正确的使用方式还是在顶级模块使用这些包。

十.访问控制

使用 from xyz import * 导入
  1.如果模块没有 __all__ , from xyz import * 只导入非下划线开头的该模块的变量。如果是包,子模块也不 会导入,除非在 __all__ 中设置,或 __init__.py 中导入它们
  2.如果模块有 __all__ , from xyz import * 只导入 __all__ 列表中指定的名称,哪怕这个名词是下划线开头 的,或者是子模块
  3.from xyz import * 方式导入,使用简单,但是其副作用是导入大量不需要使用的变量,甚至有可能造成名 称的冲突。而 __all__ 可以控制被导入模块在这种导入方式下能够提供的变量名称,就是为了阻止from xyz import *导入过多的模块变量,从而避免冲突。因此,编写模块时,应该尽量加入 __all__ from module import name1, name2 导入
  这种方式的导入是明确的,哪怕是导入子模块,或者导入下划线开头的名称
  程序员可以有控制的导入名称和其对应的对象

十一.模块变量的修改

  模块对象是同一个,因此模块的变量也是同一个,对模块变量的修改,会影响所有使用者。

  除非万不得已,或明确知道自己在做什么,否则不要修改模块的变量。

  前面学习过的猴子补丁,也可以通过打补丁的方式,修改模块的变量、类、函数等内容。
#!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie print(__name__) PI = 3.14

test01.py内容

#!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie import test01 as t1 print(t1.PI)

test02.py内容

 #!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie import test01 as t1 print(t1.PI)
t1.PI = 3.1415926 import test02
test01
3.14
3.1415926

以上代码执行结果戳这里

Python包模块化调用方式详解的更多相关文章

  1. 第10.8节 Python包的导入方式详解

    一. 包导入与模块导入的关系 由于包本质上是模块,其实对模块的许多导入方法都适用于包,但由于包的结构与模块有差异,所以二者还是有些区别的: 对包的导入,实际上就是包目录下的__init__.py文件的 ...

  2. Python模块调用方式详解

    Python模块调用方式详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其 ...

  3. Python包管理工具setuptools详解及entry point

    1.什么是setuptools? setuptools是Python distutils增强版的集合,它可以帮助我们更简单的创建和分发Python包,尤其是拥有依赖关系的.用户在使用setuptool ...

  4. python selenium 三种等待方式详解[转]

    python selenium 三种等待方式详解   引言: 当你觉得你的定位没有问题,但是却直接报了元素不可见,那你就可以考虑是不是因为程序运行太快或者页面加载太慢造成了元素不可见,那就必须要加等待 ...

  5. python设计模式之装饰器详解(三)

    python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...

  6. Dubbo配置方式详解

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是阿里巴巴 SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次 ...

  7. Java WebService接口生成和调用 图文详解>【转】【待调整】

    webservice简介: Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应用之间 ...

  8. Fiddler抓取https请求 & Fiddler抓包工具常用功能详解

    Fiddler抓取https请求 & Fiddler抓包工具常用功能详解   先来看一个小故事: 小T在测试APP时,打开某个页面展示异常,于是就跑到客户端开发小A那里说:“你这个页面做的有问 ...

  9. Python中的高级数据结构详解

    这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考 ...

随机推荐

  1. 封装redis操作 php版本

    <?php namespace App\Service; use App\Service\BaseService; use Illuminate\Support\Facades\Redis; / ...

  2. helm安使用

    参照:https://juejin.im/post/5b6590afe51d4519962f02b1

  3. 深入Nginx之《HTTP请求报文与HTTP响应报文》

    HTTP请求报文 这个很有必要了解,好歹我们得知道Nginx在提供HTTP服务时,客户端都会传些什么.HTTP请求中客户端传送的内容称为HTTP请求报文. 1.请求行包含: 请求方法,请求URL,HT ...

  4. JobStorage.Current property value has not been initialized. You must set it before using Hangfire Client or Server API.

    JobStorage.Current property value has not been initialized. You must set it before using Hangfire Cl ...

  5. npx vs npm

    npx vs npm npx 使用教程

  6. lnmp卸载删除多余的php版本

    /etc/init.d/php-fpm5.3 stoprm -rf /usr/local/php5.3rm -f /etc/init.d/php-fpm5.3rm -f /usr/local/ngin ...

  7. 【视频开发】Gstreamer框架中使用gst-launch进行流媒体播放

    Gstreamer框架中使用gst-launch进行流媒体播放 Gstreamer是一套开源的流媒体框架,用其也可以进行流媒体开发,Gstreamer是基于glib库编写的,需要将多个不同功能的元件( ...

  8. 基于面绘制的MC算法以及基于体绘制的 Ray-casting 实现Dicom图像的三维重建(python实现)

    加入实验室后,经过张老师的介绍,有幸与某公司合共共同完成某个项目,在此项目中我主要负责的是三维 pdf 报告生成.Dicom图像上亮度.对比度调整以及 Dicom图像三维重建.今天主要介绍一下完成Di ...

  9. Kubernetes集群中Jmeter对公司演示的压力测试

    6分钟阅读 背景 压力测试是评估Web应用程序性能的有效方法.此外,越来越多的Web应用程序被分解为几个微服务,每个微服务的性能可能会有所不同,因为有些是计算密集型的,而有些是IO密集型的. 基于微服 ...

  10. Zookeeper的典型应用场景(转)

    在寒假前,完成了Zookeeper系列的前5篇文章,主要是分布式的相关理论,包括CAP,BASE理论,分布式数据一致性算法:2PC,3PC,Paxos算法,Zookeeper的相关基本特性,ZAB协议 ...