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. mysql处理数据库事务

    数据库事务 关注公众号"轻松学编程"了解更多. 1.概念 ​ 执行批量操作时,这些操作作为一个整体,要么全部成功,要么全部失败.如银行转账,己方扣钱.对方加钱,这两个操作是一个整体 ...

  2. 【Luogu】P1306 斐波那契公约数 题解

    原题链接 嗯...很多人应该是冲着这个标题来的 (斐波那契的魅力) 1.分析题面 点开题目,浏览一遍题目,嗯?这么简单?还是蓝题? 再看看数据范围,感受出题人深深的好意... \(n,m \leq 1 ...

  3. leetcode117:search-rotated-sorted-array

    题目描述 给出一个转动过的有序数组,你事先不知道该数组转动了多少 (例如,0 1 2 4 5 6 7可能变为4 5 6 7 0 1 2). 在数组中搜索给出的目标值,如果能在数组中找到,返回它的索引, ...

  4. iOS开发 objective C 代码布局

    代码布局抛弃storyboard,用代码生成界面,它的优劣不谈 首先在项目设置中,更改应用的"入口" 不选main,清空它 然后在AppDelegate.m中,更改(添加内容),别 ...

  5. 二维码生成与windows系统IP查询功能

    一个木函是一款强大的手机软件,里面囊括了很多小功能,每一个都基本可以堪称小程序.那么,这些小功能具体是怎么实现的呢?让我们来一起来探讨二维码生成.IP查询这两个功能吧! 一.二维码生成 首先,我们来看 ...

  6. 强迫自己学习Jquery 最喜欢的hitch函数

    用过dojo的人都知道hitch. 通过绑定一个函数的上下文得到一个新函数,当然还能绑定参数 Jquery里没有这个功能,实在太不方便了. 这是我不喜欢用Jquery的第一原因,第二原因是Jquery ...

  7. 手写@koa/router源码

    上一篇文章我们讲了Koa的基本架构,可以看到Koa的基本架构只有中间件内核,并没有其他功能,路由功能也没有.要实现路由功能我们必须引入第三方中间件,本文要讲的路由中间件是@koa/router,这个中 ...

  8. AI时代,还不了解大数据?

    如果要问最近几年,IT行业哪个技术方向最火?一定属于ABC,即AI + Big Data + Cloud,也就是人工智能.大数据和云计算. 这几年,随着互联网大潮走向低谷,同时传统企业纷纷进行数字化转 ...

  9. 异步FIFO学习笔记

  10. Ceph部署的时候修改默认权重

    前言 部署集群的时候权重是默认生成的,这个是根据磁盘大小分配的,我们有的时候需要去修改一下这个默认权重 修改 如果统一的初始值,那么直接添加参数即可 osd_crush_initial_weight ...