package, module, script(二)

package的目标是为了让客户使用,客户可能是你,可能是组里的合作者,甚至分享给其他需要的人,也就是一个distribution。因此package应当便于安装,引用。package可以有子package。

使用package里的资源

有如下结构的pacakge, 外层package名称是test2, 内嵌subpackage1


package结构

__init__.py

#!/usr/bin/python
# -*- coding: utf-8 -*-
#filename: __init__.py
#nothing here, only flag the path as a package

module1.py

#!/usr/bin/python
# -*- coding: utf-8 -*-
#filename: module1.py

def sub(x, y):
  return x - y

module2.py

#!/usr/bin/python
# -*- coding: utf-8 -*-
#filename: module2.py

def add(x, y):
  return x + y

如何使用?
由于__init__.py中没有进行引用,现在为了使用add或者sub资源,我们需要如下引用

>>> from test2.module1 import sub
>>> sub(2, 1)
1
>>> 

namespace

有时,认为像上面那样引用函数,class比较麻烦,希望像from test2 import sub一样引用。将模块,或者子包(sub-package)中的资源通过上层package导出,是一种比较好的命名管理方式。

  • 如何使用
    直接在__init__.py文件中使用import
    __init__.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
#filename: __init__.py

from module1 import sub
from module2 import add

现在可以直接从test2 package中引入sub和add函数

>>> from test2 import sub, add
>>> add(1,2)
3
>>> sub(3,1)
2
>>> 

如果想在test2 package中导入module1中所有的资源,可以直接from module2 import *, 导入所有除了_开始的资源(_开始的资源应当是私有资源,不应当对外界可见)。

test2.__init__.py文件

#!/usr/bin/python
# -*- coding: utf-8 -*-
#filename: __init__.py

from module1 import *
from module2 import add

现在可以直接从test2 package中导入module1的资源, 而不用显式的写出test2.module1。

>>> from test2 import *
>>> sub(2, 1)
1
>>> length(3, 4)
5.0
#_power不会被导入
>>> _power(2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name '_power' is not defined
  • 限制资源
    有时,从某个模块或者sub-package中导入资源,需要限制某些资源,需要使用__all__列表变量明确列出可以导出的资源。

因此, *表示
if __all__ list exists in module or __init__.py file of sub-package
     导出__all__列表中指定的资源。
else
     导出所有资源(_xxx除外)。

方法如下:
在__init__.py中, 使用__all__变量,__all__ = ['resource1', 'resource2'..., 'resourceN']。__all__列表变量可以帮助控制当使用import *时,该module或者package哪些模块被导出。但是,不在__all__列表中的,也可以显示的直接导出。

在module1.py中增加__all__列表变量,将需要导出的资源(函数,类,变量)名称(字符串形式)写在列表中。

#!/usr/bin/python
# -*- coding: utf-8 -*-
#filename: module1.py

from math import sqrt

#需要导出的资源名称
__all__ = ['sub']

def sub(x, y):
  return x - y

def length(x, y):
  return sqrt(_power(x)+_power(y))

def _power(x):
  return x*x

使用

>>> from test2.module1 import *
>>> sub(3,1)
2
#length没有写在__all__中,因此,这个没有通过*导出来
>>> length(3,4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'length' is not defined
#虽然没有通过*导出,但是可以显示引用length函数
>>> from test2.module1 import length
>>> length(3,4)
5.0
>>> 

当模块或者sub-package中使用__all__时,可以在package的__init__.py中, 这样package也限制了对外暴露的资源。

#!/usr/bin/python
# -*- coding: utf-8 -*-
#filename: __init__.py
__all__ = []
__all__.extends(module1.__all__)

总结

  • 在module或package中可以通过引用改变资源的命名空间,这与java或者C#很不一样
  • 可以通过__all__限制资源的导出
  • 可以强制显式的引用资源

关键字

  • __all__
  • __init__.py
  • import
  • *
  • list
  • extends

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,657评论 18 139
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,746评论 0 10
  • 今日一样,今天月底最后一天了,与组里的任务还差许多。八月份即将迎来,争取好好干活,完成目标,把前几个月的弥补过来
    AA京心达小任阅读 121评论 0 0