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. Java线程池初步解读

    好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star 几个月前,写了一篇<Java并发学习(一):进程和线 ...

  2. 开发工具:Mybatis.Plus.插件三种方式的逆向工程

    本文源码:GitHub·点这里 || GitEE·点这里 一.逆向工程简介 在Java开发中,持久层最常用的框架就是mybatis,该框架需要编写sql语句,mybatis官方提供逆向工程,可以把数据 ...

  3. 02 . 02 . Go之Gin+Vue开发一个线上外卖应用(集成第三方发送短信和xorm生成存储数据库表)

    集成第三方发送短信 介绍 用户登录 用户登录有两种方式: 短信登录,密码登录 短信登录是使用手机号和验证码进行登录 短信平台 很多云平台,比如阿里云,腾讯云,七牛云等云厂商,向程序开发者提供了短信验证 ...

  4. 计算机网络:TCP协议建立连接的过程为什么是三次握手而不是两次?【对于网上的两种说法我的思考】

    网上关于这个问题吵得很凶,但是仔细看过之后我更偏向认为两种说的是一样的. 首先我们来看看 TCP 协议的三次握手过程 如上图所示: 解释一下里面的英文: 里面起到作用的一些标志位就是TCP报文首部里的 ...

  5. mkdir()和mkdirs()区别

    mkdir()和mkdirs()区别如下: mkdirs()可以建立多级文件夹, mkdir()只会建立一级的文件夹, 如下: new File("/tmp/one/two/three&qu ...

  6. 18FlaskRESTful

    一,虚拟环境下安装(win) 在安装这个环节发现了很多问题,pycharm里装了之后发现根本引用不了,查明原因是因为第三方库pycharm无法识别. 解决办法:进入虚拟环境直接pip. 二,基本使用 ...

  7. Future Callable 线程池 例1

    package com.niewj.concurrent; import java.util.concurrent.Callable; import java.util.concurrent.Exec ...

  8. KMP算法和bfprt算法总结

    目录 1 KMP算法 1.1 KMP算法分析 1.2 KMP算法应用 题目1:旋转词 题目2:子树问题 2 bfprt算法 2.1 bfprt算法分析 2.2 bfprt算法应用 1 KMP算法 大厂 ...

  9. 安全也挺让人心烦的 ---login shell

    今天查问题时, ssh 登录后台发现 需要输入密码,输入密码后弹出一个二维码, 然后扫码获取秘钥.输入秘钥登陆!!! 真是恶心了一把,找手机都花了不少时间!!!! 那么怎样干掉输入密码这些操作呢??? ...

  10. setPriority()优先级

    1 . 优先级表示重要程度或者紧急程度.但是能不能抢到资源也是不一定.2 . 分配优先级:反映线程的重要或紧急程度线程的优先级用1-10 表示,1的优先级最低,10的优先级最高,默认值是5 packa ...