day24 包

1.   包

  包是一种通过 '.模块名'来组python模块名称间的形. 那什么样的东西是包呢?
建的个文件夹都可以被称之为包. 但是我们要注意, python2. 包内必须存
__init__.py文. 建包的目的不是为了运行, 而是被入使用. 包只是一种式而已. 包的本
就是一种模块

  为何要使用包? 包的本就是一个文件夹, 那么文件夹唯一的功能就是起来,
功能, 我们无所有功能都在一个文, 于是我们使用模块去组功能,
模块, 我们就要一个件夹将模块文起来, 以此来提高程序的结性和可
维护

首先, 我们先建一些包. 用来作为接下来的. 包很好. 只要是一个文件夹,
init__.py就可以 (尽管python3不要求,为了安全起见还是装了比较保险)

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/__init__.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 version.py: ',conf)
#manage.py
def main():
print('from manage.py')
#models.py
def register_models(engine):
print('from models.py: ',engine)

接下来. 我们在test中使用包中的内容. 并且, 我们入包的时候可以使用import或者
from xxx import xxx这种.
首先, 我们看import

import glance.db.models
glance.db.models.register_models('mysql')
#没问题,可以正常运行

 我们还可以使⽤from xxx import xxx 入包内的模块

from glance.api.policy import get
get()

也没问题,但是着白要注意的是from xxx import xxx这种, import后⾯不可以出现""
就是说from a.b import cok. 但是 from a import b.c 是错误的

2.   __init__

包里的__init__.py是什么鬼? 其实.
我们使用种方入一个包, 只要是第一次入包或者是包的何其他部分, 都会先执行
__init__.py文. 这个文可以是. 但也可以存放⼀些初始化的代码. (随意在glance中的
__init__.py都可以进行测试)

 

那我们之前用的from xxx import *还可以⽤么? 可以. 我们要在__init__.py文
__all__* 入的内容.

#在__init__文件中
print
("我是glance的__init__.py⽂件. ") x = 10 def hehe(): print("我是呵呵") def haha(): print("我是哈哈") __all__ = ['x', "hehe"]

在test文件中

from glance import *
print(x) # OK
hehe() # OK
haha() # 报错. __all__没有这个东西

3   .绝对导入和星对导入

我们的最顶级包glance是写给别人用.
后再glance包内部也会有此之间入的需求, 这时候就有入和相对入两种
方式了.
1. : glance作为起

2. 相对: 以. 或者..作为起始(.当前文件躲在目录, ..当前文件所在目录的上一级目录)
例如, 我们在glance/api/version.py中使用glance/cmd/manage.py

# 在glance/api/version.py
#绝对导入
from glance.cmd import manage
manage.main()
#相对导入
# 这种情形不可以在versions中启动程序.
# attempted relative import beyond top-level package
from ..cmd import manage
manage.main()

测试的时候要注意. python路径跟运行本所在的目有关系. 说白了. 就是你运行
py文所在的目. python中不允许你运行的程序包的时候过当前包的范围(相对
). 如果使用. 没有这个问题. 个说法. 如果你在包内使用了相对. 那在使用
包内信息的时候. 只能在包外面.

 

包的注意事项:
1. 关于包相关的语句也分为importfrom xxx import xxx两种, 但无使用,
无论在什么位, 入时都必须遵循三: 是在入时d点的. 左边必须是一
个包. . 可以带一串的点. 比如a.b.c

2. import入文. 产生名称间中的名字来于文, import , 产生的名称
中的名字同样来于文, 包下的__init__,py, 入包本就是在该文
3. A和包B下有同名模块也不会冲突, A.aB.a来自两个名称

 

 

猜你喜欢

转载自www.cnblogs.com/tjp40922/p/9988719.html