zoukankan      html  css  js  c++  java
  • Python 模块详解及import本质

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

    模块定义

    • 本质就是.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

    1 name='alex'
    2 def say_hello():
    3     print('hello alex')
    4 
    5 
    6 def logger():
    7     print('logger')
     1 # 导入方法1, 导入指定变量名或方法
     2 import module_alex
     3 
     4 print(module_alex.name)
     5 module_alex.say_hello()
     6 
     7 
     8 
     9 # 导入方法2, 导入某个文件全部 (相当于把导入文件的代码加到当前文件中, 所以调用其方法不需要再加文件名,可直接调用)
    10 from module_alex import *
    11 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.

    例:

    1 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.来调用

    导入优化

     1 # 若一段代码中多次调用另一个文件中的一个方法, 这样调用会在各个方法中反复找该方法
     2 import module_test
     3 
     4 def logger():
     5     module_test.test()
     6     print('in the logger')
     7 
     8 
     9 def search():
    10     module_test.test()
    11     print('in the search')
    12 
    13 
    14 # 优化
    15 from module_test import test
    16 
    17 def logger():
    18     test()
    19     print('in the logger')
    20 
    21 
    22 def search():
    23     test()
    24     print('in the search')
  • 相关阅读:
    Atitit 人脸识别 眼睛形态 attilax总结
    Atitit 手机号码选号 规范 流程 attilax总结 v2 r99.docx
    atitit 板块分类 上市公司 龙头企业公司 列表 attilax总结.docx
    Atititi atiitt eam pam资产管理 购物表去年.xlsx
    使用cmd查看电脑连接过的wifi密码(一)
    常见十大web攻击手段 悟寰轩
    常见web攻击方式 悟寰轩
    【MYSQL数据库】MYSQL学习笔记mysql分区基本操作 悟寰轩
    Filter及FilterChain的使用详解 悟寰轩
    启动tomcat spring初始化两次问题(eg:@PostConstruct) 悟寰轩
  • 原文地址:https://www.cnblogs.com/cheese320/p/8985271.html
Copyright © 2011-2022 走看看