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. 02 HTML 常见标记 选择器 样式

    no.02今天主要学习了在web中的HTML CSS,并在其中制作了明信片,在制作明信片途中有几个知识点需要总结:1.HTML 全称hyper text markup language 超文本标记语言 ...

  2. .NET内存分析工具-dotMemory

    .NET内存分析工具-dotMemory 1.介绍 官网链接 引言 程序内存占用较大?内存溢出?需要分析生产环境程序怎么办? dotMemory 使您可以分析各种 .NET 和 .NET Core应用 ...

  3. .Net/.Net Core 的界面框架 NanUI 发布新版本啦!

    发布前感悟 NanUI 自从上一次更新 NanUI 0.7 已经过去大半年,B站和头条的教学视频也只制作到了第二集. 有朋友悄悄问我是不是发生什么事故我删库跑路了所以那么长时间不更新项目不发布教程,当 ...

  4. 企业微信公众号告警Python脚本

    #!/usr/bin/env python # -*- coding: utf-8 -*- import time import requests import json import os impo ...

  5. centos 6.5 时间网络同步

    安装 ntpdate sudo yum -y install ntp ntpdate 修改为上海时区 sudo vim /etc/sysconfig/clock ZONE = "Asia/S ...

  6. .netcore简单使用hangfire

    Hangfire简介 Hangfire是一个开源的任务调度框架,它内置集成了控制页面,很方便我们查看,控制作业的运行:对于运行失败的作业自动重试运行.它支持永久性存储,支持存储于mssql,mysql ...

  7. python开发基础(二)运算符以及数据类型之int(数字)

    # encoding: utf-8 # module builtins # from (built-in) # by generator 1.147 """ Built- ...

  8. Redux学习day1

    01.React介绍 Redux是一个用来管理管理数据状态和UI状态的JavaScript应用工具.随着JavaScript单页应用(SPA)开发日趋复杂,JavaScript需要管理比任何时候都要多 ...

  9. SQL Server 存储过程解析XML传参 参考方案

    1.定义存储过程 -- =============================================--定义存储过程-- ================================ ...

  10. Pycharm激活码(2020最新永久激活码)

    如果下边的Pycharm激活码过期失效了的话,大家可以关注我的微信公众号:Python联盟,然后回复"激活码"即可获取最新Pycharm永久激活码! 56NPDDVEIV-eyJs ...