zoukankan      html  css  js  c++  java
  • 9-高级语法-包

    1.模块

    • 一个模块就是一个包含python代码的文件,后缀名是.py,模块就是python文件

    • 为什么我们用模块

      • 程序太大,编写维护非常不方便,需要拆分
      • 模块可以增加代码重复利用的方式
      • 但做命名空间使用,避免命名冲突
    • 如何定义模块

      • 模块就是一个普通文件,所以任何代码可以直接书写
      • 不过根据模块的规范,最好在模块中编写以下内容
        • 函数(单一功能)
        • 类(相似功能的组合,或者类似业务模块)
        • 测试代码
    • 如何使用模块

      • 模块直接导入
        • 假如模块名称直接以数字开头,需要借助importlib帮助
        • import 模块 as 别名
          • 导入的同时给模块起一个别名
          • 其余用法跟第一种相同
        • from module_name import func_name, class_name
          • 按上述方法有选择性导入
          • 使用的时候可以直接使用导入的内容,不需要前缀
        • from module_name import *
          • 导入模块所有内容
          • 缺点:无法防止命名污染
        • if name == 'main':
          • 此判断语句建议一直作为程序的入口
          • 可以有效避免模块代码导入的时候被动执行的问题
      • 语法
    # 直接导入
    import module_name
    module_name.function_name
    module_name.class_name
    
    # 借助于importlib包可以实现导入以数字开头的模块名称
    import importlib
    
    tuling = importlib.import_module("01")
    
    # import 模块 as 别名 
    import p01 as p
    stu = p.Student('jjc', 19)
    stu.say()
    
    # from module_name import func_name, class_name
    from p01 import Student,sayHello
    
    stu = Student()
    stu.say()
    sayHello()
    
    # from module_name import *
    from p01 import *
    
    stu = Student()
    stu.say()
    sayHello()
    

    2.模块的搜索路径和存储

    • 什么事模块的搜索路径
      • 加载模块的时候,系统会在哪些地方寻找此模块
    • 系统默认的模块搜索路径
    • 添加搜索路径
    • 模块的加载顺序
      1. 搜索内存中已经加载好的模块
      2. 搜索python的内置模块
      3. 搜索sys.path路径
    # 系统默认的模块搜索路径
    import sys
    # sys.payh属性可以获取路径列表
    print(type(sys.path))
    print(sys.path)
    
    for p in sys.path:
    	print(p) 
    # 添加搜索路径
        sys.path.append(dir)
    

    3. 包

    • 包是一种组织管理代码的方式,包里面存放的是模块
    • 用于将模块包含在一起的文件夹就是包
    • 自定义包的结构
    - 包
    -- __init__.py 包的标志文件
    -- 模块1
    -- 模块2
    -- 子包(子文件夹)
    --- __init__.py 包的标志文件
    --- 子包模块1
    --- 子包模块2
    
    • 包的导入操作
    #coding=gbk
    
    # 1. import package_name
    # 直接导入一个包,只可以使用__init__.py中的内容
    '''
    import pkg01
    
    pkg01.inInit() # package_name.func_name
    '''
    # package_name.class_name.func_name()
    
    # 2. import package_name as p
    # 具体用法跟操作方式,跟上述简答导入一致
    # 注意的事此种方法是默认对__init__.py内容导入
    
    # 3.import package.module
    # 导入包中某一个具体的模块
    # 使用方法
    '''
    import pkg01.p01
    
    pkg01.p01.sayHello()     # package.module.func_name
    pkg01.p01.Student().say()# package.module.class.fun()
    pkg01.p01.Student().var  # package.module.class.var
    '''
    
    # 4.import package.module as pm
    
    
    # 5.from ...import 导入
    # 5.1 from package import module1,module2,module3,……
    	# 此种导入方法不执行'__init__'的内容
    '''
    from pkg01 import p01
    
    
    p01.Student('jjc').say() # moule.class_name.func_name
    p01.sayHello()			# module.func_name
    '''
    
    # from package import *
    # 导入当前包__init__.py文件中所有的函数和类
    # 使用方法
    # func_name()
    # class_name.func_name()
    # class_name.var
    '''
    from pkg01 import *
    
    inInit()
    '''
    #stu = Student() 找不到Student()
    
    # from package.module import *
    # 导入包中指定的模块的所有内容
    # 使用方法
    	
    	
    '''
    from pkg01.p01 import *
    
    Student().say() # class_name.func_name()
    sayHello()      # func_name()
    '''
    
    • 在开发环境中经常会用其他模块,可以在当前包中直接导入其他模块中的内容
      - imoort 完整的包或者模块的路径
    • all__的用法
      - 在使用from package import * 的时候,*可以导入的内容
      - “init.py”中如果文件为空,或者没有__all
      ,那么只可以把'init'中的内容导入
      - __init__如果设置了__all__的值,那么则按照__all__指定的子包或者模块进行载入,如此不会载入'init'中的内容
      - all = ['module1', 'module2', 'package1',。。。。]

    4.命名空间

    • 用于区分不同位置不同功能但相同名称的函数或者变量的一个特定前缀
    • 作用是防止命名冲突
  • 相关阅读:
    IPV6地址中的%号什么意思
    比较分析C++、Java、Python、R语言的面向对象特征,这些特征如何实现的?有什么相同点?
    Linux 查看本机串口方法
    非对称加密与GPG/PGP
    bootstrap下拉三角
    bootstrap文本背景色
    bootstrap文本颜色
    bootstrap栅格系统响应式
    软件测试(一) 软件测试的阶段划分
    YoTube 视频如何下载
  • 原文地址:https://www.cnblogs.com/rener0424/p/10389047.html
Copyright © 2011-2022 走看看