同在当前目录下的模块和包导入

模块定义

  • 本质就是.py结尾的python文件. 用来从逻辑上组织python代码(变量,函数,类,逻辑)
  • 文件名: test.py;  对应的模块名 : test

模块导入方式

  • import module_name

    • 调用时需要加module_name. (有点类似java中的类名.调用)
  • import module1_name, module2_name
    • 调用时需要加module_name (有点类似java中的类名.调用)
  • from module_name import * 
    • 不建议用这种方法. 若导入的包中变量名或方法名与当前文件的变量名或方法名一样, 这样会有冲突. 当前文件中同名的方法会覆盖导入文件中的同名方法.
    • 调用时可以直接调用变量名或方法名, 不需要加module_name. (有点像java中调用同一个类中的方法, 直接用就行, 不用加类名.)
  • from module_name import logger as logger_alex (导入和当前文件中方法同名的方法时可以起个别名logger_alex,以避免和当前文件中的方法冲突)
    • 调用时可以直接调用变量名或方法名, 不需要加module_name. (有点像java中调用同一个类中的方法, 直接用就行, 不用加类名.)

导入模块本质

  • 导入模块的本质就是把python文件解释一遍

例:

module_alex

 name='alex'
def say_hello():
print('hello alex') def logger():
print('logger')
 # 导入方法1, 导入指定变量名或方法
import module_alex print(module_alex.name)
module_alex.say_hello() # 导入方法2, 导入某个文件全部 (相当于把导入文件的代码加到当前文件中, 所以调用其方法不需要再加文件名,可直接调用)
from module_alex import *
logger() # 若当前文件中也有一个方法名叫logger(), 这样会有冲突. 当前文件的logger()会覆盖导入文件中的logger()方法

包定义

  • 本质就是一个目录(必须有一个__init__.py文件)
  • 用来从逻辑上组织模块

包导入方式

  • import package_name
  • 包导入的本质
    • 导入包的本质就是执行该包下的__init__.py文件4
  • 若包下面除了__init__.py还有其它文件, 想要调用这些文件, 直接 package_name.test1是不行的, 因为导入包的本质是执行下面的__init__.py文件.
    • 这种情况下, 需要在__init__.py文件中导入该package_name下的其它文件
    • 也可以在__init__.py文件中用from.import test1 (代表从当前目录下导入test1)的方法导入同一目录下的另一个python文件test1.

例:

 import package_test

不在当前目录下的模块和包导入

默认情况下, 不在当前目录下无法导入.

导入模块动作解析:

找到要导入的模块的路径再导入 (在sys.path中寻找. sys.path中存储的第一个路径就是当前路径)

import module_name ----> module_name.py ----> 找到module_name.py的路径  ----> sys.path

要想导入不在当前目录下的模块或包, 要把它的绝对路径(os.path.abspath(__file__))加入sys.path.

path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

sys.path.append(path)  # 这样这个路径会在最后面,每次都要遍历到最后才能找到(如果中途没有同名文件的话)
sys.path.insert(0,path) # 将该路径插到前面去 import module_alex # 加完路径再导入就可以了
module_alex.logger() # 调用时要加module_name.来调用

导入优化

 # 若一段代码中多次调用另一个文件中的一个方法, 这样调用会在各个方法中反复找该方法
import module_test def logger():
module_test.test()
print('in the logger') def search():
module_test.test()
print('in the search') # 优化
from module_test import test def logger():
test()
print('in the logger') def search():
test()
print('in the search')

Python 模块详解及import本质的更多相关文章

  1. 小白的Python之路 day5 python模块详解及import本质

    一.定义 模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能) 本质就是.py结尾的python文件(文件名:test.py,对应的模块名:test) 包:用来从逻辑上组织模块 ...

  2. Python模块详解以及import本质,获得文件当前路径os.path.abspath,获得文件的父目录os.path.dirname,放到系统变量的第一位sys.path.insert(0,x)

    模块介绍 1.定义: 模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质就是.py结尾的python文件(文件名:test.py,对应的模块名:test) 包:用来从逻 ...

  3. Python:模块详解及import本质

    转于:http://www.cnblogs.com/itfat/p/7481972.html 博主:东大网管 一.定义: 模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能), ...

  4. 模块详解及import本质

    一.模块的定义 用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能) 本质就是.py结尾的Python文件(文件名test.py,对应的模块名:test) 包:用来从逻辑上组织模块的 ...

  5. python模块详解

    什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写的代码(.p ...

  6. python模块详解 | selenium(持续更新中)

    目录: 关于selenium Selenium 安装Selenium 安装浏览器驱动 配置环境变量 selenium方法详解 定位元素 元素操作 浏览器操作 鼠标事件 浏览器事件 设置元素等待 多表单 ...

  7. python模块详解 random os

    random模块 常用方法 random.random() 随机产生一个小于1的浮点数 import random print(random.random()) #0.4153761818276826 ...

  8. python模块详解 | shutil

    简介: shutil是python的一个内置模块,提供了许多关于文件和文件集合的高级操作,特别提供文件夹与文件操作.归档操作了支持文件复制和删除的功能. 文件夹与文件操作: copyfileobj(f ...

  9. python模块详解 sys shutil

    sys模块 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 sy ...

随机推荐

  1. lambda表达式初步

    // Lambda_test20140801.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <algorithm& ...

  2. 十分钟搞定mongodb副本集

    mongodb副本集配置 最近项目中用到了mongodb,由于是用mongodb来记录一些程序的日志信息和日常的统计,为了增加应用的可靠性,一直在找mongodb集群的一些资料,下面是对最近做的一个小 ...

  3. 别跟我谈EF抵抗并发,敢问你到底会不会用EntityFramework

    前言 一直以来写的博文都是比较温婉型的博文,今天这篇博文算是一篇批判性博文,有问题欢迎探讨,如标题,你到底会不会用EntityFramework啊. 你到底会不会用EntityFramework啊 面 ...

  4. for 循环为何可恨?

    Java的闭包(Closure)特征最近成为了一个热门话题. 一些精英正在起草一份议案,要在Java将来的版本中加入闭包特征. 然而,提议中的闭包语法以及语言上的这种扩充受到了众多Java程序员的猛烈 ...

  5. Struts2 中的数据传输的几种方式

    1.     如何将参数从界面传递到Action? 你可以把Struts2中的Action看做是Struts1的Action+ActionForm,即只需在Action中定义相关的属性(要有gette ...

  6. Hibernate JPA 动态criteria语句针对null查询条件的特殊处理

    最近原Hibernate项目需要添加一个条件,结构有点类似下面的格式,学生和房间是多对一的关系,现在要查询所有没有房间的学生. Class Student{ @ManyToOne Room room; ...

  7. python3学习笔记2---引用http://python3-cookbook.readthedocs.io/zh_CN/latest/2

    2018-03-01数据结构和算法(2) 1.6字典中的键映射多个值 一个字典就是一个键对应一个单值的映射.如果你想要一个键映射多个值,那么你就需要将这多个值放到另外的容器中, 比如列表或者集合里面. ...

  8. js如何读写txt文件?(曲线救国篇)

    .emmm,不存在的.做不到的. 但是,你可以继续往下阅读,或许能实现你想要的功能. 前言:一般我们需要用js来实现文件读写,都是一些比较小的,离线的应用(因为如果可以联网,什么json什么db都任意 ...

  9. day11_jsp/EL/JSTL学习笔记

    一.jsp概述 JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP实际上就是Servlet. JSP这门技术的最大 ...

  10. springboot~为Money类型添加最大值和最小值的注解校验

    在spring框架里,为我们集成了很多校验注解,直接在字段上添加对应的注解即可,这些注解基本都是简单保留类型的,即int,long,float,double,String等,而如果你自己封装了新的类, ...