2.5python基础之常用模块

  1. 什么是模块?
    在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。
    为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Python中,一个.py文件就称之为一个模块(Module)。
  2. 使用模块有什么好处?
    1.最大的好处是大大提高了代码的可维护性。其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块。
    2.使用模块还可以避免函数名和变量名冲突。每个模块有独立的命名空间,因此相同名字的函数和变量完全可以分别存在不同的模块中,所以,我们自己在编写模块时,不必考虑名字会与其他模块冲突
  3. 模块分类
    模块分为三种:
    内置标准模块(又称标准库)执行help('modules')查看所有python自带模块列表
    第三方开源模块,可通过pip install 模块名 联网安装 
    自定义模块
  4. 模块调用
    import module
    
    from module import xx
    
    from module.xx.xx import xx as rename  
    
    from module.xx.xx import *
    
    注意:模块一旦被调用,即相当于执行了另外一个py文件里的代码
  5. 模块查找路径
    发现,自己写的模块只能在当前路径下的程序里才能导入,换一个目录再导入自己的模块就报错说找不到了, 这是为什么?
    这与导入路径有关
    import sys
    
    print(sys.path)
  6. 包(Package)
    当你的模块文件越来越多,就需要对模块文件进行划分,比如把负责跟数据库交互的都放一个文件夹,把与页面交互相关的放一个文件夹,
    .
    └── my_proj
        ├── crm #代码目录
        │   ├── admin.py
        │   ├── apps.py
        │   ├── models.py
        │   ├── tests.py
        │   └── views.py
        ├── manage.py
        └── my_proj #配置文件目录
            ├── settings.py
            ├── urls.py
            └── wsgi.py
    
    像上面这样,一个文件夹管理多个模块文件,这个文件夹就被称为包
    那不同包之间的模块互相导入呢?
    crm/views.py内容
    
    def sayhi():
        print('hello world!')
    通过manage.py调用
    
    from crm import views
    
    views.sayhi()
    
    执行manage.py (注意这里用python2)
    Alexs-MacBook-Pro:my_proj alex$ ls
    crm        manage.py    my_proj
    Alexs-MacBook-Pro:my_proj alex$ python manage.py 
    Traceback (most recent call last):
      File "manage.py", line 6, in <module>
        from crm import views
    ImportError: No module named crm
    
    竟然说找不到模块,为什么呢?
    包就是文件夹,但该文件夹下必须存在 __init__.py 文件, 该文件的内容可以为空。__int__.py用于标识当前文件夹是一个包。
    在crm目录下创建一个空文件__int__.py ,再执行一次就可以了
    
    注意,在python3里,即使目录下没__int__.py文件也能创建成功,猜应该是解释器优化所致,但创建包还是要记得加上这个文件 吧。
  7. 跨模块导入
    ├── __init__.py
    ├── crm
    │   ├── __init__.py
    │   ├── admin.py
    │   ├── apps.py
    │   ├── models.py
    │   ├── tests.py
    │   ├── views.py  
    ├── manage.py   
    └── proj
        ├── __init__.py
        ├── settings.py
        ├── urls.py
        └── wsgi.py
    
    根据上面的结构,如何实现在crm/views.py里导入proj/settings.py模块?
    直接导入的话,会报错,说找到不模块
    
    $ python3 views.py
    Traceback (most recent call last):
      File "views.py", line 2, in <module>
        from proj import settings
    ModuleNotFoundError: No module named 'proj'
    
    是因为路径找不到,proj/settings.py 相当于是crm/views.py的父亲(crm)的兄弟(proj)的儿子(settings.py),settings.py算是views.py的表弟啦,在views.py里只能导入同级别兄弟模块代码,或者子级别包里的模块,根本不知道表弟表哥的存在。这可怎么办呢?
    答案是添加环境变量,把父亲级的路径添加到sys.path中,就可以了,这样导入 就相当于从父亲级开始找模块了。
    crm/views.py中添加环境变量
    
    import sys ,os
    
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #__file__的是打印当前被执行的模块.py文件相对路径,注意是相对路径
    print(BASE_DIR)
    
    sys.path.append(BASE_DIR)  
    
    from proj import settings
    
    def sayhi():
        print('hello world!')
    
    print(settings.DATABASES)

猜你喜欢

转载自www.cnblogs.com/sszy/p/9070735.html