day21 01包的初识

包:把解决一类问题的模块放在同一个文件夹里面-----包(一个包里面通常会含有_init_.py文件(python2里面必须有),但是后面的就没有要求一定要有了)

同样导入的时候有import和 from  import 两种

注意:凡是导入是带点的,点的左边必须是一个包模块,对于from import类型的来说,import后面不能带有点,(from glance import policy.api是错误会报错)

在pcharm的project里面建立了一个glance包,而glance包里面又有api,cmd,db包还有一个_init_.py文件,再在api包里面又有一个policy.py和_versions_.py文件,

cmd里面有一个_init_.py和manage.py文件,而db包里面有一个models.py文件,要想生成这些文件,可执行以下代码:

import os
os.makedirs('glance/api')
os.makedirs('glance/cmd')
os.makedirs('glance/db') #创建三个目录
l=[] #创建一个列表,是为了下面将七个文件统一关闭
l.append(open('glance/_init_.py','w'))
l.append(open('glance/api/_init_.py','w'))
l.append(open('glance/api/policy.py','w'))
l.append(open('glance/api/versions.py','w'))
l.append(open('glance/cmd/_init_.py','w'))
l.append(open('glance/cmd/manage.py','w'))
l.append(open('glance/db/models.py','w')) #打开七个文件,同时生成文件句柄,把这七个文件句柄放到列表中
map(lambda f:f.close(),l) #拿到列表里面每一个文件句柄,并进行关闭

各个生成的文件里面的内容:

policy.py

def get():
print('from policy.py')

versions.py

def create_resource(conf):
print('from versions.py: ',conf)

manage.py

def main():
print('from manage.py')

models.py

def register_models(endine):
print('from models.py: ',engine)

生成一个glance包后,我们就可以执行导入的操作了:

(1)直接import+包点包点.....点方法,然后 print(包点包点.....点方法点get())就可以看到是否导入了

import glance.api.policy as policy
policy.get()

运行结果:

from policy.py

(2)from 包点包点......点包 import  方法(这种方法需要注意import后面不能带点)

from glance.api import policy
policy.get()

运行结果:

from policy.py

如果此时在project下面还有glance外面再建一个dir文件夹,此时要import glance就找不到了,因为:

导入的时候是根据以下路径导入的,当将glance放到dir下面的时候,只找到了前面两个而且都是'C:\\Users\\sku1-1\\PycharmProjects\\untitled',后面就与它无关了,

而glance在dir里面,dir在它的里面,后面没有说明就找不到了。

import sys
print(sys.path)

运行结果:

['C:\\Users\\sku1-1\\PycharmProjects\\untitled', 'C:\\Users\\sku1-1\\PycharmProjects\\untitled', 'C:\\Users\\sku1-1\\PycharmProjects\\untitled\\venv\\Scripts\\python35.zip', 'C:\\Users\\sku1-1\\AppData\\Local\\Programs\\Python\\Python35\\DLLs', 'C:\\Users\\sku1-1\\AppData\\Local\\Programs\\Python\\Python35\\lib', 'C:\\Users\\sku1-1\\AppData\\Local\\Programs\\Python\\Python35', 'C:\\Users\\sku1-1\\PycharmProjects\\untitled\\venv', 'C:\\Users\\sku1-1\\PycharmProjects\\untitled\\venv\\lib\\site-packages', 'C:\\Users\\sku1-1\\PycharmProjects\\untitled\\venv\\lib\\site-packages\\setuptools-39.1.0-py3.5.egg', 'C:\\Users\\sku1-1\\PycharmProjects\\untitled\\venv\\lib\\site-packages\\pip-10.0.1-py3.5.egg', 'C:\\Program Files\\JetBrains\\PyCharm 2018.2.2\\helpers\\pycharm_matplotlib_backend']

要想找到glance,只能通过:

from dir.glance.api import policy
policy.get()

或者先添加一个路径给它:

sys.path.insert(0,'C:\\Users\\sku1-1\\PycharmProjects\\untitled\\dir')#在第一个路径插入,这里多了一个dir
from glance.api import policy
policy.get()

运行结果:

from policy.py

如果按照以下代码执行导入:

import glance
glance.api.policy.get()#找不着

是会报错的,运行结果:

Traceback (most recent call last):
File "<encoding error>", line 23, in <module>
AttributeError: module 'glance' has no attribute 'api'

为什么呢?

平时我们导入一个模块,就会执行这个模块,但是导入一个包,它不会执行里面的方法,而是默认执行它里面的_init_.py文件,可以在_init_.py文件里面放一些内容,

并执行 import glance就可以验证了

由于每次导入一个包都会执行它的init文件,所以可以在_init_.py里面进行操作,所以先在dir下的_init_.py文件里面导入:

from glance import api
from glance import cmd
from glance import db

而此时也还是导入了一个 api,cmd,db包,还是不会执行api里面的policy方法,同样跟上面一样,继续在glance包里面的_init_.py文件导入policy:

from glance.api import policy

此时我们就可以执行以下代码,而不会报错了

import glance
glance.api.policy.get()

运行结果:

from policy.py

day21 01 包的初识的更多相关文章

  1. day21 02 包的进阶

    day21 02 包的进阶 1._init_.py文件的操作---导入包 根据day21 01 包的初识,建立的glance包,直接import glance后通过“包点包..点方法”是不能执行所要的 ...

  2. day 21 01 序列化模块和模块的导入的复习以及包的初识

    day 21 01 序列化和模块的导入的复习以及包的初识 1.序列化模块 什么是序列化模块:数据类型转化成字符串的过程就是序列卷 为什么要使用序列化模块:为了方便存储和网络传输 三种序列化模块: (1 ...

  3. Python函数01/函数的初识/函数的定义/函数调用/函数的返回值/函数的参数

    Python函数01/函数的初识/函数的定义/函数调用/函数的返回值/函数的参数 内容大纲 1.函数的初识 2.函数的定义 3.函数的调用 4.函数的返回值 5.函数的参数 1.函数初识 # def ...

  4. 01 Mysql数据库初识

    一.数据库概述 1.什么是数据库? 什么是数据库呢? 先来看看百度怎么说的 数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增.截取.更新.删除等操作. 所谓“ ...

  5. Fiddler-001-抓包工具初识

    Fiddler 是一个非常简单的网络调试器,也是目前最常用的http抓包工具之一 .通过 Fiddler,我们能够能够记录客户端和服务器之间的所有 HTTP请求,即记录并检查所有你的电脑和互联网之间的 ...

  6. 包的初识和进阶&异常处理

    包 包是一种通过使用‘.模块名’来组织python模块名称空间的方式. 1. 无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警 ...

  7. hdu1864(01包)

    最大报销额 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  8. python模块, 包的初识

    Python 模块(Module), 是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 模块让你能够有逻辑地组织你的 Python 代码段. 把相关的代 ...

  9. DP的初级问题——01包、最长公共子序列、完全背包、01包value、多重部分和、最长上升子序列、划分数问题、多重集组合数

    当初学者最开始学习 dp 的时候往往接触的是一大堆的 背包 dp 问题, 那么我们在这里就不妨讨论一下常见的几种背包的 dp 问题: 初级的时候背包 dp 就完全相当于BFS DFS 进行搜索之后的记 ...

随机推荐

  1. Cocos2dx如何引用第三方SO文件(Android NDK)

    做项目的过程中发现,引用第三方的库lib3rdsdk.so,当直接把lib3rdsdk.so放进armeabi文件夹里,会被删除掉.查网上资料都说的不全,经过实验,最简单的方法就是在jni下的andr ...

  2. python中如何理解if __name__ == '__main__'

    __name__ 是当前模块名,当模块被直接运行时模块名为 __main__ .这句话的意思就是,当模块被直接运行时,以下代码块将被运行,当模块是被导入时,代码块不被运行.我们通过一个简单的例子来理解 ...

  3. 10.07 WZZX Day2总结

    今天仍然是KCZ出题.今天才知道KCZ不仅是WZ地区史上最强选手而且还是ZJ队长?在ZJOI拿到Rank1的男人?%%%%% 今天KCZ出题的依然很强势…… T1.wzoi 期望得分20-100 实际 ...

  4. ZOJ1081 Points Within 点和多边形的位置关系

    ZOJ1081 给一个点和一个多边形 判断点在多边形内(边上)还是在多边形外 在多边形外的点引一条射线必然穿过多边形的两条边 而在多边形内的点则不一定. 当然凹多边形有特殊情况 但是总能找到对应位置关 ...

  5. query或者JavaScript实现在textarea光标处插入文本

    1.Jquery函数实现: $(function() { /* 在textarea处插入文本--Start */ (function($) { $.fn.extend({ insertContent ...

  6. P2700逐个击破(并查集/树形dp)

    P2700 逐个击破 题目背景 三大战役的平津战场上,傅作义集团在以北平.天津为中心,东起唐山西至张家口的铁路线上摆起子一字长蛇阵,并企图在溃败时从海上南逃或向西逃窜.为了就地歼敌不让其逃走,老毛同志 ...

  7. robotframework - User key 操作

    一.用户关键字操作思路 a.创建model1资源 b.在model下创建用户关键字 - 循环 c.测试套件下创建test_case/case2 & 用户关键字 d.测试套件中导入Resourc ...

  8. webservice 权限控制

    webservice 如何限制访问,权限控制?1.服务器端总是要input消息必须携带用户名.密码信息 如果不用cxf框架,SOAP消息(xml片段)的生成.解析都是有程序员负责 2.拦截器 为了让程 ...

  9. GIT学习之路最终日 标签管理+总结

    本文参考廖雪峰老师的博客进行总结,完整学习请转廖雪峰博客 6.1 创建标签 命令git tag (name)用于新建一个标签,默认为HEAD,也可以指定一个commit id: git tag -a ...

  10. 洛谷 P2090 数字对

    发现如果给定两个数(a,b),可以用类似辗转相除法在logn的时间内计算出(反向)变到(1,1)的最小步数. 然而并不知道另一个数是多少? 暴力嘛,枚举一下另一个数,反正1000000的nlogn不虚 ...