python大作战之模块与模块间的调用

 

大家好,今天又研究了下模块与模块之间的调用,很多情况下,我们会遇到跨模块的调用,那么如何更好的来调用呢?接下来就跟大家一起来探讨下:

情景一:(test包下面包含两个模块,分别是test-1和test-2)

test
->__init__.py
->test-1.py
->test-2.py

test-2中有如下的方法和变量
name='tom'
def run():
    print('running')

在这种情景下,test-1想调用test-2中的属性或方法时应该怎么做?见如下

import test-2
print(test-2.name)---->输出:tom
print(test-2.run())---->输出running

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

情景二:(test-2模块是和test包同级,都位于python包下面)

python
     test
       ->__init__.py
       ->test-1.py
     test-2.py
        

其中test-1中有如下代码:
name='test-1'
def walk()
    print('walking')

在这种情况下test-2想调用test-1的属性和方法该怎么办?

test-2想调test-1中的属性和方法
在__init__模块中
from . import test-1

在test-2模块中
import test--->这是在test-2中导入包test--->这里导入的也是包,不是模块
print(test.test-2.name)或者
test.test-2.walk()

 分别输出test-1和walking

所以,导入包其实就是执行包里的__init__.py文件,那执行__init__文件时,只要在init文件中调用test-1模块,那test-2就能调用到test-1的属性和方法

情景三:(test包中的test-1模块想调用test-2中的属性和方法)

python
     test
       ->__init__.py
       ->test-1.py
     test-2.py
        

其中test-2中有如下代码:
name='test-2'
def walk()
    print('walking-test-2')

这种情况,因为test包和test-2模块都是属性python这个包下面的,所以那就需要把test所在的包加到环境变量中,那在搜索时test包和test-2模块都能找到

import os,sys
x=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0,x)
import test-2--->这里导入的是包,这是重点
print(test-2.name)或者
test-2.walk()

分别输出test-2和walking-test-2

情景四:(test和test-x包中分别带有一个模块)

python
     test
       ->__init__.py
       ->test-1.py
     test_x
       ->__init__.py
       ->test-2.py


其中test-1中有如下代码:
name='test-1'
def walk()
    print('walking-test-1')

其中test-2中有如下代码:
name='test-2'
def walk()
    print('walking-test-2')

如果跨包去掉另一个模块呢?其实方法一样,加入test-2想调test-1中的属性和方法

这是在test-2模块中写的代码:
import os,sys
x=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0,x)
import test----->注意这里是导入包(这是关键,不是模块哦)
print(test.test-1.name)或者
test.test-1.walk()

同时因为是调包里的模块的原因,所以,其实是执行__init__文件里的内容
所以在init模块中需要导入test-1模块
from . import test-1

--->这时候就输出test-1和walking-test-1

综上:

假如某个模块想调用另一个模块中的属性和方法,调方必须和被调方在同一个目录或者说在同一个路径下

但是,如果是模块和包在同一个目录下的这种情况,模块调包中的模块时,主要是执行init文件,需要把同级目录的模块导入到init文件中,来使得另一个模块在执行init文件时,可以调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值