西天取经python之路 DAY(十二)

python模块的定义、导入和优化


  • 模块的定义:本质是一个python文件。从逻辑上组织代码(变量,函数,类,逻辑等)去实现一个功能。
  • 包的定义:本质上就是一个目录(包含了一个_init_.py文件)。从逻辑上组织模块。
  • 模块的导入:
import module1,module2,module3……

from module1 import *

from module1 import prt as print_m1

#注意:直接使用import module1的时候,调用module1里的prt方法应该使用如下写法:

module1.prt()

#如果使用from module1 import *的时候应该这样写(如果不想导入全部方法只想导入部分,可以把*换成相应的方法名)

prt()

#这里可以看出,from的格式是将module1里的代码拷贝出来,复制到当前位置并执行,因此不需要加前缀。


#如果当前文件中有定义了一个和导入模块中同名的方法,而运行的时候又不想覆盖,则可以使用如下写法:

from module1 import prt as print_m1

#注意:此时导入模块中的方法运行的时候不再是prt(),而是print_m1()。


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

1、import module1 相当于 module1=all_code (module1里的所有代码)

#因此使用import方法时,调用模块里的方法应该是:module1.prt()

2、from module1 import prt 相当于把prt()这个方法的代码拷贝到当前文件里

#因此调用方法时可以直接prt()

  • 导入包的本质是执行包下面的_init_.py文件

 


  • 导入同级目录下的模块或包

目录如下:

conf里的__init__.py文件:

# encoding: utf-8
'''
# @Author  : ccq
# @File    : __init__.py.py
# @Time    : 2019/6/16 11:37
'''

from . import settings  # 相对路径导入写法(.表示相对路径)

#from . import settings 这样的写法是用来导入同级目录下的文件的。

settings文件:

# encoding: utf-8
'''
# @Author  : ccq
# @File    : settings.py
# @Time    : 2019/6/16 11:37
'''


def testfunc():
    print("this is settings")

imp文件:

# encoding: utf-8
'''
# @Author  : ccq
# @File    : imp.py
# @Time    : 2019/6/20 20:14
'''

import conf

conf.settings.testfunc()

 

 


  • 导入不在同一目录下的模块或包

导入模块和包时可以通过print(sys.path)来查看当前目录,如果当前目录下没有要导入的文件,就会报错。

通过 print(os.path.abspath(__file__)) 这段代码,可以看到当前文件的路径。

通过os.path.dirname(os.path.abspath(__file__))代码,查询当前文件的父目录路径。

#os.path.dirname()是查询查询当前文件的父目录路径,os.path.abspath(__file__)是当前文件的路径。二者缺一不可。

通过以上方式,不断向上返回,来找到正确的路径。然后通过sys.path.append()方法添加路径。

#当然,append是加到末尾,如果要想放在前面的话,就用insert

#下面是一个小例子:

# encoding: utf-8
'''
# @Author  : ccq
# @File    : atm.py.py
# @Time    : 2019/6/16 11:36
'''
# 启动文件
import os, sys

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

sys.path.append(BASE_DIR)
from conf import settings
from core import main

main.prt()

#结构图如下:


  • 导入优化:

 

#当一个py文件中重复出现另外模块里的方法调用时,例如:

# encoding: utf-8
'''
# @Author  : ccq
# @File    : imp.py
# @Time    : 2019/6/20 20:14
'''

import module_test


def function1():
    module_test.testfunc()

def function2():
    module_test.testfunc()
    
def function3():
    module_test.testfunc()
    
def function4():
    module_test.testfunc()
    
def function5():
    module_test.testfunc()

#conf.settings.testfunc()这段代码重复了很多次。这段代码的意思是到conf包下的settings文件里去调用testfunc()方法,如果每一次都去找,将产生大量不必要的消耗。这时可以采用如下方法:

# encoding: utf-8
'''
# @Author  : ccq
# @File    : imp.py
# @Time    : 2019/6/20 20:14
'''

from module_test import testfunc


def function1():
    testfunc()

def function2():
    testfunc()

def function3():
    testfunc()

def function4():
    testfunc()

def function5():
    testfunc()

function1()

#这样可以减少消耗,来达到优化的效果


  • 模块的分类:

模块分为三大类:

  1. 标准库
  2. 开源模块
  3. 自定义模块
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值