[Python3] 025 包

Posted YorkFish

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Python3] 025 包相关的知识,希望对你有一定的参考价值。

1. 模块

1.1 模块是什么?

  • 模块就是个 Python 文件
    • 一个模块就是一个包含 Python 代码的文件
    • 后缀名成是 .py 就可以

1.2 为什么用模块?

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

1.3 如何定义模块?

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

1.4 如何使用模块?

  • 模块直接导入

    • 假如模块名称直接以数字开头,需要借助 importlib 帮助
  • 语法

import module_name


module_name.class_name
module_name.function_name

1.4.1 例子1

import module_name

"""
保存为 student.py

包含:
Student 类
    sayhello()
print 语句
"""


class Student(object):
    def __init__(self, name="NoName", age=18):
        self.name = name
        self.age = age

    def say(self):
        print("My name is {0}.".format(self.name))


def say_hello():
    print("Hi, this module's name is 'student'.")


if __name__ == "__main__":
    print(">>> module Student")  # 类似的语句,建议写此处
  • student.py 所在的文件夹中新建一个 Python 文件
import student


stu = student.Student("Tom")
stu.say()
print(stu.age)

student.say_hello()
  • if __name__ == "__main__" 的使用
    • 可以有效避免模块代码被导入的时候被动执行的问题
    • 建议以此为程序的入口

1.4.2 例子2

import importlib

"""
保存为 01_student.py

包含:
Student 类
    sayhello()
"""


class Student(object):
    def __init__(self, name="NoName", age=18):
        self.name = name
        self.age = age

    def say(self):
        print("My name is {0}.".format(self.name))
  • 01_student.py 所在的文件夹中新建一个 Python 文件
  • 借助 importlib 包,可以导入以数字开头命名的模块
# import 01_student  # SyntaxError: invalid token
import importlib


# 相当于导入了一个叫 01_student 的模块,并将该模块赋值给了 new
new = importlib.import_module("01_student")
stu = new.Student()
stu.say()

1.4.3 例子3

import module_name as new_name

  • 导入的同时给模块起一个别名
import student as st


stu = st.Student("Jerry", 17)
stu.say()
print(stu.age)

st.say_hello()

1.4.4 例子4

from module_name import class_name, func_name

  • 使用的时候可以直接使用导入的内容,不需要前缀
from student import Student, say_hello


stu = Student("Tom")
stu.say()
print(stu.age)

say_hello()

1.4.5 例子5

from module_name import *

  • 导入模块所有内容
from student import *


stu = Student("Tom")
stu.say()
print(stu.age)

say_hello()

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

2.1 什么是模块的搜索路径?

  • 加载模块的时候,系统会在那些地方寻找此模块
  • 系统默认的模块搜索路径
import sys


# sys.path 属性可以获取路径列表
print(type(sys.path))
print(sys.path)

for p in sys.path:
    print(p)

2.2 如何添加搜索路径?

sys.path.append(dir)

2.3 模块按什么顺序加载?

  1. 搜索内存中已经加载好的模块
  2. 搜索 Python 的内置模块
  3. 搜索 sys.path 路径

3. 包

  • 包是一种组织管理代码的方式
  • 包里面存放的是模块
    - 用于将模块包含在一起的文件夹就是包

3.1 自定义包的结构是怎样的?

|---包
|---|--- __init__.py  包的标志文件
|---|--- 模块1
|---|--- 模块2
|---|--- 子包(子文件夹)
|---|---|--- __init__.py  包的标志文件
|---|---|--- 子包模块1
|---|---|--- 子包模块2

3.2 如何导入包?

3.2.1 例子1

import package_name

  • 直接导入一个包
  • 可以使用 __init__.py 中的内容,但 __init__.py 中一般为空

  • 文件结构

|---pkg1
|---|--- __init__.py
|---|---
|---use_pkg1.py
  • 示例
# save as __init__.py

def in_init():
    print("I am in init of package.")
# save as use_pkg1.py

import pkg1


pkg1.in_init()

3.2.2 例子2

import package_name as new_name

  • 简化包名
  • import module_name as new 用法一致
  • 此种方法是默认对 __init__.py 内容的导入
  • 示例
# save as use_pkg2.py

import pkg1 as p


p.in_init()

3.2.3 例子3

import package_name.module_name

  • 文件结构
|---pkg1
|---|--- __init__.py
|---|--- student.py
|---|---
|---use_pkg3.py
  • 示例
# save as use_pkg3.py

import pkg1.student


stu = pkg1.student.Student("Tom")
stu.say()
print(stu.age)

pkg1.student.say_hello()

3.2.4 例子4

from package_name import module_name

  • 这种导入方法不执行 __init__.py 中的内容
  • 示例
# save as use_pkg4.py

from pkg1 import student


stu = student.Student("Tom")
stu.say()
print(stu.age)

student.say_hello()

3.2.5 例子5

from package import module1, module2, module3, ...

  • 导入包中指定的模块的所有内容

3.2.6 例子6

from package_name import *

  • 导入当前包 __init__.py 文件中所有的类和函数

    3.2.7 例子7

from package_name.module import *

  • 导入包中指定模块的所有内容

3.3 __all__

  • 在使用 from package import * 的时候,* 可以导入的内容与 __all__ 有关
  • __init__.py 中没有内容,或没有 __all__,则只能导入 __init__ 中的内容
  • __init__.py 设置了__all__的值,那么按照 __all__ 指定的子包或者模块进行加载,此时不会载入__init__中的其他内容

  • 文件结构

|---pkg1
|---|--- __init__.py
|---|--- student.py
|---|---
|---use_pkg.py
  • 示例
# save as __init__.py

__all__ = ['module1', 'module2', 'package1', ...]

def in_init():
    print("I am in init of package.")
# save as use_pkg.py

from pkg1 import *


stu = student.Student("Tom")
stu.say()
print(stu.age)

student.say_hello()
  • 补充
    • 在开发中,经常会所以用其他模块,可以在当前包中直接导入其他模块中的内容
    • 使用 import 包或者模块的绝对路径

4. 命名空间

  • 用于区分不同位置不同功能但相同名称的函数或者变量的一个特定前缀
  • 防止命名冲突
setName()
Student.setName()
Teacher.setName()

以上是关于[Python3] 025 包的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记:python3,代码片段(2017)

scrapy主动退出爬虫的代码片段(python3)

scrapy按顺序启动多个爬虫代码片段(python3)

~随笔B025~Linux定时任务执行sh脚本,变更jdk

python常用代码片段总结

Qt&Vtk-025-QChartTable