首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python模块-part1

python模块-part1

作者头像
py3study
发布2020-01-07 16:08:17
3130
发布2020-01-07 16:08:17
举报
文章被收录于专栏:python3python3

一:介绍

模块定义:模块就是实现了某个功能的代码集合,一个模块可以定义函数,类和变量。模块还可以包括可运行的代码。

优点:代码重用,可维护性高

语法:

导入单一模块:

import module_name

导入多个模块

import module_name1,module_name2,......

调用符号:.

import os
print(os.sep)
print(os.getcwd())

模块与文件关系:一个.py文件即一个模块,反之亦然。

对于一个模块test有如下定义:

模块的文件名:test.py
模块名:test
模块导入:import test

二:模块的名称空间(作用域)

定义:名称空间就是一个从名称到对象的关系映射,每个模块都定义了自己的名称空间,即每个模块有自己独立的作用域。

分类:python程序在运行时具有三个名称空间,内建(__builtin__模块),全局,局部,python解释器先加载内建名称空间,后加载全局名称空间,最后加载局部名称空间。

名称空间与作用域关系:从内往外找,以较内层作用域为准

示例一:

module_a.py

x=1

def test():
    print('from the module module_a')
    
module_b.py内容如下

module_b.py

x=2

def test():
    print('from the module module_b')

test.py

import module_a
import module_b

print(module_a.x)
print(module_b.x)
print(module_a.x+module_b.x)
module_a.test()
module_b.test()

运行结果:
1
2
3
from the module module_a
from the module module_b

示例二:

module_a.py

x=1

def test():
    print('from the module module_a',x)

test.py

import module_a
x=2
print(child_module.x)
child_module.x=10
print(child_module.x)

三:模块的搜索路径和路径搜索

模块导入需要经历路径搜索的过程,路径搜索就是在你预定义的搜素路径里查找你想要导入的模块

如果在预定义路径为找到,抛出异常(pycharm的特殊功能除外)

自定义模块b在父级目录里(如有特殊需要可以使用sys.path.insert()方法)

解决:

import sys,os

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

import b
b.test()

四:from-import语句和as

五:包

定义:包就是一组模块的集合

包与目录的区别:包必须包含一个空文件(也可以有内容)__init__

六:阻止属性导入

如果你不想让某个模块属性被 "from module import *" 导入 , 那么你可以给你不想导入的属性名称加上一个下划线( _ )。 不过如果你导入了整个模块或是你显式地导入某个属性这个隐藏数据的方法就不起作用了。

示例一:

module_test.py

def foo():
    print('from the func foo')

def _bar():
    print('from the func bar')

test.py

from child_module import *

foo()
bar()

抛出异常:
NameError: name 'bar' is not defined

示例二:

module_test.py

def foo():
    print('from the func foo')

def _bar():
    print('from the func bar')

test.py

from child_module import _bar

_bar()
正常运行

七:导入循环(交叉引用)与import原理

导入循环:两个模块互相导入

import原理:将导入的模块执行一遍

在python开发过程中,应尽量避免导入循环(交叉引用),但是,如果你开发了大型的 Python 工程, 那么你很可能会陷入这样的境地。

解决方法:

将 import 语句移到函数的内部,只有在执行到这个模块时,才会导入相关模块。

错误示范:

b.py

import os
import a

def get_size(file_path):

    if a.file_exists(file_path):
        file_size=os.path.getsize(file_path)
        print('the file %s size is[%s]' %(file_path,file_size))

a.py

import os
import b

def file_exists(file_path):
    return os.path.isfile(file_path)

def download(file_path):
    b.get_size(file_path)
    print('download file %s' %file_path)

def upload(file_path):
    print('upload file %s' %file_path)

download('a.txt')

解决方法:修改b.py

import os

def get_size(file_path):
    import a
    if a.file_exists(file_path):
        file_size=os.path.getsize(file_path)
        print('the file %s size is[%s]' %(file_path,file_size))

a.py不变

import os
import b

def file_exists(file_path):
    return os.path.isfile(file_path)

def download(file_path):
    b.get_size(file_path)
    print('download file %s' %file_path)

def upload(file_path):
    print('upload file %s' %file_path)

download('a.txt')
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-09-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档