1.命名空间

  模块儿的名字加上文件的名字,就是命名空间。
  python如何区分一个普通的文件夹和一个包的?
    在一个文件夹下有一个特定的文件__init__.py,此时这个文件夹就是一个包。(前后各两个下划线)。其中,这个文件本身也是一个模块儿。这个模块儿的名字就是他的直属文件夹的名字。
 

2.模块儿的引入:

  第一种:

 
 
  我们不能直接导入模块儿下的变量的。
  修改引入模块儿的名字:
import t.c7 as m
print(m.a)

  第二种:

from t.c7 import a 
print(a)
//或者
# from t import c7
#print(c7.a)
  引入所有的变量:
from t.c7 import *
print(a)
print(c)
print(d)
  其中t.c7中的变量定义为:
a = 2
c = 3
d = 4
  在t.c7中可以指定通过*号导出变量或者函数,如下值导出a,c变量:
  t.c7.py:
__all__ = ['a', 'c']   

a = 2
c = 3
d = 4
  此时执行c8.py文件:
from t.c7 import *

print(a)
print(c)
print(d)
//2
//3
//Traceback (most recent call last):
// File ".\c8.py", line 9, in <module>
// print(d)
//NameError: name 'd' is not defined
  其中__all__称为模块儿的内置变量。

第三种:

from c9 import a,b,c

'''
from c9 import a
from c9 import b
from c9 import c
'''
python建议: 一行字符的个数最好不要超过80个
此时涉及到换行而不改变代码本意:
from c9 import a,b,\
c  
上边示例并不建议,显得很突兀,所以建议使用括号来进行:
from c9 import (a,b,
c)
 

3.__init__.py文件的作用:

 

单个导入:

 
  导入包的时候, 该文件会自动执行。
  c11文件中:
import t
  此时执行c11.py:
#This is __init__.py file t中的__init__.py文件自动执行。
  当然,只引用t中的c7文件,__init__.py依旧可以执行。
  在 __init__.py文件中写入:
__all__ = ['c7']
  在t文件夹下加入c8.py文件,c8.py文件中写入:
e = 2
f = 3
g = 4
  c11文件中写入,并运行c11
from t import *
print(c7.a)
#2
print(c8.e)
#error: NameError: name 'c8' is not defined
 

  批量导入:

    关于项目目录:
    在t文件夹下的 __init__.py中批量导入模块儿:
import sys
import datetime
import io
  在c13文件下引用:
import t
print(t.sys.path)
#['F:\\pythonlearn\\my-pythonFirst\\six', 'E:\\py3\\python38.zip', 'E:\\py3\\DLLs', 'E:\\py3\\lib', 'E:\\py3', 'C:\\Users\\Administrator\\AppData\\Roaming\\Python\\Python38\\site-packages', 'E:\\py3\\lib\\site-packages']

  包与模块儿:

    1.包与模块儿是不会被重复导入的:
    2.避免循环导入
 
    什么是循环导入呢?
    例如,新建P文件夹,在p文件夹下有p1和p2两个文件:
    p1中:
from p2 import p2
p1 = 2
print(p2)
  p2中:
from p1 import p1
p2 = 2
  此时执行p1就会报错。
Traceback (most recent call last):
File ".\p1.py", line 1, in <module>
from p2 import p2
File "F:\pythonlearn\my-pythonFirst\six\p\p2.py", line 1, in <module>
from p1 import p1
File "F:\pythonlearn\my-pythonFirst\six\p\p1.py", line 1, in <module>
from p2 import p2
ImportError: cannot import name 'p2' from partially initialized module 'p2' (most likely due to a circular import) (F:\pythonlearn\my-pythonFirst\six\p\p2.py)
 
  import 导入的同时,就会执行被导入模块儿的代码。
 

模块儿的内置变量:

a = 2
c = 3 infos = dir();
print(infos)
# ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'a', 'c']
  打印内置变量里的具体信息:先看结构
  1.在c9.py中:
'''

    This is a c9 doc

'''

print("name:"+__name__)
print("package:"+__package__)
print("doc:"+__doc__)
print("file:"+__file__)
  2.在c15中引入:
import t.t1.c9
    此时的打印结果:
name:t.t1.c9
package:t.t1
doc: This is a c9 doc
  如果c9中没有上边的注释,则会报错:
TypeError: can only concatenate str (not "NoneType") to str
 

入口文件和普通模块内置变量的区别:

 
  修改c15.py
import t.t1.c9

print("name:"+__name__)
print("package:"+__package__)
print("doc:"+__doc__)
print("file:"+__file__)
  打印结果:
name:t.t1.c9
package:t.t1
doc: This is a c9 doc file:F:\pythonlearn\my-pythonFirst\six\t\t1\c9.py
name:__main__
Traceback (most recent call last):
File ".\c15.py", line 9, in <module>
print("package:"+__package__)
TypeError: can only concatenate str (not "NoneType") to str
  继续修改:
'''
描述
'''
import t.t1.c9 print('~~~~~~~~~~~~~~~~~~~~c15~~~~~~~~~~~~~~~~~~~~~~~~~')
print("name:" + __name__)
print("package:" + (__package__ or '当前模块不属于任何包'))
print("doc:" + __doc__)
print("file:" + __file__)
  打印结果:
name:t.t1.c9
package:t.t1
doc: This is a c9 doc file:F:\pythonlearn\my-pythonFirst\six\t\t1\c9.py
~~~~~~~~~~~~~~~~~~~~c15~~~~~~~~~~~~~~~~~~~~~~~~~
name:__main__
package:当前模块不属于任何包
doc:
描述 file:.\c15.py
  总结: 因为运行的是c15.py文件,因此它是一个入口文件,所以不属于任何包。而c9从t下的t1引入,所以c9属于t.t1包。
  此外,file结果根运行时环境有关:
 
  对于dir()函数的补充:
 
  函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息。
 
对于一句代码的解读:
if __name__ == "__main__":
pass
  可以用Make a script both importable and executable來概括:
  让你的脚本既可以提供一个脚本,供其他程序去调用,也可以自己作为一个可执行文件。
 
  当一个模块儿处于两种不同的情景的时候,在这两种情境中代码的逻辑是不同的,这个时候就需要用到这段程序。
  例如,在c17.py中写入:
if __name__ == "__main__":
print('This is app') print('This is a module')
  此时如果是直接执行该文件,可得到:
  

  This is app
  This is a module
  如果是被调用:
This is a module
  这是因为,作为入口文件时,它的内置变量__name__的值就是__main__
  我们也可以通过命令来作为模块儿调用文件:
python -m six.c17
  此时,c17是six文件夹下的py文件,命令行是在six的同级目录下进行(要让他称为一个模块,他就必须是一个包下的文件,否则会报错):
PS F:\pythonlearn\my-pythonFirst> python -m six.c17 
This is app
This is a module
  对于以上代码注意:
    ① 如果six下没有__init__.py,则找不到c17这个文件
    ② 如果是在six目录下执行:
PS F:\pythonlearn\my-pythonFirst\six> python -m c17
This is app
This is a module //-m 后边如果是文件,则会报错
PS F:\pythonlearn\my-pythonFirst\six> python -m .\c17.py
E:\py3\python.exe: Relative module names not supported
  对于根目录下的c15执行命令:( python -m six.c15)
'''
描述
'''
import t.t1.c9 print('~~~~~~~~~~~~~~~~~~~~c15~~~~~~~~~~~~~~~~~~~~~~~~~')
print("name:" + __name__)
print("package:" + (__package__ or '当前模块不属于任何包'))
print("doc:" + __doc__)
print("file:" + __file__)
  会报错,报错内容是找不到文件t,此时需要在t文件前加six.
'''
描述
'''
import six.t.t1.c9 print('~~~~~~~~~~~~~~~~~~~~c15~~~~~~~~~~~~~~~~~~~~~~~~~')
print("name:" + __name__)
print("package:" + (__package__ or '当前模块不属于任何包'))
print("doc:" + __doc__)
print("file:" + __file__)
  打印出来的name和package是:
name:six.t.t1.c9
package:six.t.t1
  此处涉及到了相对导入和绝对导入的问题。此时,-m 后边跟的是命名空间。

  相对导入与绝对导入:

  绝对导入:

  1.入口文件的位置决定着__package__。
  m2文件:
print(__package__);
  执行main.py
Module2.Module4
  将main.py移动到Module2中,并修改main中的引入为Module4.m2,执行main.py
Module4
  说明入口文件决定着这个命名空间。
  绝对路径: 从顶级包开始向下找。

  相对路径:

    一个点表示当前目录,两个点表示上一层目录,三个点表示上上层目录,通过n个点表示上n-1层目录
    但是import不能使用相对路径,但是可以使用from。main引用不能使用相对路径,原因是作为入口文件,被python执行后,它的name指的是__main__。而__main__是不存在的,所以在入口文件是不能使用相对路径的。但是可以通过使用-m来使得入口文件作为模块。
 
包内文件不能使用相对路径引用顶层文件。如下图:
原因是m5的顶层包是Module2,mian.py是一个入口文件,它的同级别目录下是没有__main__这个包的。
 

Python学习第四天----模块儿导入的更多相关文章

  1. python学习第四十八天json模块与pickle模块差异

    在开发过程中,字符串和python数据类型进行转换,下面比较python学习第四十八天json模块与pickle模块差异. json 的优点和缺点 优点  跨语言,体积小 缺点 只能支持 int st ...

  2. Python学习(四)数据结构(概要)

    Python 数据结构 本章介绍 Python 主要的 built-type(内建数据类型),包括如下: Numeric types          int float Text Sequence ...

  3. python学习第四讲,python基础语法之判断语句,循环语句

    目录 python学习第四讲,python基础语法之判断语句,选择语句,循环语句 一丶判断语句 if 1.if 语法 2. if else 语法 3. if 进阶 if elif else 二丶运算符 ...

  4. python学习第四次笔记

    python学习第四次记录 列表list 列表可以存储不同数据类型,而且可以存储大量数据,python的限制是 536870912 个元素,64位python的限制是 1152921504606846 ...

  5. python学习-第四天补充-面向对象

    python学习-第四天补充-面向对象 python 私有 --name mangling(名字修改.名字) 在命名时,通过使用两个下划线作为开头,可以使得这个变量或者函数编程私有的,但是这个其实的p ...

  6. Python学习笔记十_模块、第三方模块安装、模块导入

    一.模块.包 1.模块 模块实质上就是一个python文件.它是用来组织代码的,意思就是把python代码写到里面,文件名就是模块的名称,test.py test就是模块的名称 2.包 包,packa ...

  7. Python学习第二阶段,Day2,import导入模块方法和内部原理

    怎样导入模块和导入包?? 1.模块定义:代码越来越多的时候,所有代码放在一个py文件无法维护.而将代码拆分成多个py文件,同一个名字的变量互不影响,模块本质上是一个.py文件或者".py&q ...

  8. python学习日记(常用模块)

    模块概念 什么是模块 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写的代 ...

  9. 【Python学习之九】模块

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 python3.6 一.模块的使用和安装模块和C语言中的头文件以及Ja ...

随机推荐

  1. [Luogu P2387] [NOI2014]魔法森林 (LCT维护边权)

    题面 传送门:https://www.luogu.org/problemnew/show/P2387 Solution 这题的思想挺好的. 对于这种最大值最小类的问题,很自然的可以想到二分答案.很不幸 ...

  2. Redis 和 Memcached 有什么区别?Redis 的线程模型是什么?为什么单线程的 Redis 比多线程的 Memcached 效率要高得多?

    面试题 redis 和 memcached 有什么区别?redis 的线程模型是什么?为什么 redis 单线程却能支撑高并发? 面试官心理分析 这个是问 redis 的时候,最基本的问题吧,redi ...

  3. ElasticSearch初步了解和安装(windows上安装)

    ElasticSearch是什么 ElasticSearch(一般简称es)是一个基于Lucene的分布式搜索和数据分析引擎.它提供了REST api 的操作接口.它可以快速的存储.搜索.分析海量数据 ...

  4. 力扣 - 剑指Offer 35.复杂链表的复制

    目录 题目 思路1 代码实现 思路2 代码实现 题目 请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 rando ...

  5. How to Convert and Import VHD to VMDK (VMWare)

    VHD or Virtual Hard Disk is the disk image format used by Microsoft virtualization software such as ...

  6. C++实现学校运动会管理系统

    本文实例为大家分享了C++实现学校运动会管理系统的具体代码,供大家参考,具体内容如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

  7. nginx&http 第二章 ngx启动多进程

    Nginx服务器使用 master/worker 多进程模式. 主进程(Master process)启动后,会接收和处理外部信号: 主进程启动后通过fork() 函数产生一个或多个子进程(work ...

  8. ceph集群的安装和配置教程

    本篇主题: 1.怎样配置ssh免登陆访问 2.为什么搭建集群要关闭防火墙和selinux,如何关闭 3.从哪里获取ceph的安装包,怎样安装才是快速正确的 4.为什么要配置时间同步服务,怎样配置 5. ...

  9. java基本权限指南之:文件和共享目录的基本权限

    简介 java程序是跨平台的,可以运行在windows也可以运行在linux.但是平台不同,平台中的文件权限也是不同的.windows大家经常使用,并且是可视化的权限管理,这里就不多讲了. 本文主要讲 ...

  10. Environment Cubemap

    要创建一个Cubemap(将您的环境捕获到一个Cubemap中),您需要去Unity Documentation复制RenderCubemapWizard.cs脚本! 然后在"Project ...