软件测试学习 之 Python 导入自定义模块 - import

pythonimport包含子目录中的模块方法比较简单,关键是能够在sys.path里面找到通向模块文件的路径。

下面将具体分析几种常用情况:

程序结构如下:


即:
-- parent_dir
   |-- parent_module.py
   |-- current_dir
       |-- current_module.py
       |-- main_function.py
       |-- sub_dir
           __init__.py
           sub_module.py

每个自定义模块中各有一个方法

# 提示信息
def welcome():
    print("Welcome to current module!")

(1)模块程序与主程序在同一目录下:
若在程序main_function.py中导入模块current_module, 则直接使用

# 可以使用as关键字起别名
import current_module as current
或者
from current_module import *;

(2)模块程序在主程序的子目录下:

若在程序main_function.py中导入模块sub_module, 需要在sub_dir文件夹中建立空文件__init__.py文件,将子目录sub_dir作为一个Python包(也可以在该文件中自定义输出模块接口?——存疑); 然后使用

import sub_dir.sub_module as sub
或者
from sub_dir.sub_module import * 

(3)模块程序在在主程序的父目录下或其他目录(平级)下:

  • 父目录

将父目录添加到python搜索模块的路径,直接按照当前目录的导入方式即可 

import sys
sys.path.append('..')
import parent_module as parent
from parent_module import welcome as p_welcome
  • 其他目录(平级)

 添加同级目录brother_dir,目录下定义模块brother_module
-- parent_dir
   |-- parent_module.py
   |-- brother_dir
       |-- __init__.py
       |-- brother_module.py

   |-- current_dir
       |-- current_module.py
       |-- main_function.py
       |-- sub_dir
           __init__.py
           sub_module.py

若在程序main_function.py中导入brother_module,参照父目录和子目录的导入方式,首先需要在brother_dir下建立__init__.py文件(同(2))。然后使用

import sys
sys.path.append('..')
import brother_dir.brother_module as brother
from brother_dir.brother_module import welcome as b_welcome

完整程序如下:

import sys
sys.path.append('..')
import current_module as current
from current_module import welcome as c_welcome
import sub_dir.sub_module as sub
from sub_dir.sub_module import welcome as s_welcome
import parent_module as parent
from parent_module import welcome as p_welcome
import brother_dir.brother_module as brother
from brother_dir.brother_module import welcome as b_welcome

current.welcome()
c_welcome()
print()

sub.welcome()
s_welcome()
print()

parent.welcome()
p_welcome()
print()

brother.welcome()
b_welcome()
print()

执行结果:

Welcome to current module!
Welcome to current module!

Welcome to sub module!
Welcome to sub module!

Welcome to prarent module!
Welcome to prarent module!

Welcome to brother module!
Welcome to brother module!

注:

导入模块中的对象或者方法总结
方式一
   直接导入模块路径,路径较长,需要给模块起别名(别名无法用于import 代替模块路径)
   再在代码中,通过(别名.对象名)创建对象

import _04_浅拷贝与深拷贝.案例_士兵突击.pojo.gun as gun

# 使用导入的模块,创建对象
ak_47 = gun.Gun("AK47")

方式二
从模块路径直接导入对象,路径和对象分离,不必起别名(推荐) 
即,从一个模块导入部分功能

from _04_浅拷贝与深拷贝.案例_士兵突击.pojo.gun import Gun

# 直接使用模块中的Gun创建对象
m_10 = Gun("M10")

方式三(想当然,报错)
import 后面可以是导入不带路径的包,模块,对象或者方法,
 import 后面带路径时,‘.’之前必须是包名,只可以导入带路径的包,模块,
不可以直接通过带路径的方式导入对象和方法

# 此种导入会报错
import _04_浅拷贝与深拷贝.案例_士兵突击.pojo.soldier.Soldier

报错:ModuleNotFoundError: ......'_04_浅拷贝与深拷贝.案例_士兵突击.pojo.soldier' is not a package 

修改为方式二

from _04_浅拷贝与深拷贝.案例_士兵突击.pojo.soldier import Soldier 

wang = Soldier("王宝强")

其他注意事项 :

1. 导入模块包含同名功能
如果有两个模块存在同名的函数,那么后倒入模块的函数,会覆盖掉先导入的函数

2. 导入模块所有功能

from 模块名 import *

 这种方式不推荐使用,出现问题不好排查

3. 隐藏模块中不需要执行的代码
导入模块时,文件中没有任何缩进的代码,都会执行一遍
__name_属性可以让模块测试的代码在导入时不被执行

  • __name_是Python的一个内置字符串类型属性
  • 如果是作为主程序执行,__name__的值就是__main__
  • 如果是被其他文件导入,__name__的值就是模块名
class HouseItem:
    pass


# 打印__name__的值
print("__name__:",__name__)


主程序中执行时:
__name__: __main__

作为模块导入时:
__name__: 家具.house_item

实际使用时,可将测试代码包含在判断语句中

if __name__ == '__main__':
    # 模块内测试代码
    pass

猜你喜欢

转载自blog.csdn.net/jian3x/article/details/88813729