- 1、本文档共3页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
10.4 将模块分割成多个文件
10.4 将模块分割成多个⽂件
问题
你想将⼀个模块分割成多个⽂件。但是你不想将分离的⽂件统⼀成⼀个逻辑模块时使
已有的代码遭到破 。
解决⽅案
程序模块可以通过变成包来分割成多个独⽴的⽂件。考虑下下⾯简单的模块:
# mymodule.py
class A :
def spam(self):
print(A .spam)
class B(A):
def bar(self):
print(B.bar)
假设你想mymodule .py分为两个⽂件,每个定义的⼀个类。要做到这⼀点,⾸先⽤
mymodule ⽬录来替换⽂件mymodule .py 。 这这个⽬录下,创建以下⽂件:
mymodule/
__init__.py
a.py
b.py
在a.py⽂件中插⼊以下代码:
# a.py
class A :
def spam(self):
print(A .spam)
在b .py⽂件中插⼊以下代码:
# b.py
from .a import A
class B(A):
def bar(self):
print(B.bar)
最后,在 init .py 中,将2个⽂件粘合在⼀起:
# __init__.py
from .a import A
from .b import B
如果按照这些步骤,所产⽣的包MyModule将作为⼀个单⼀的逻辑模块:
import mymodule
a = mymodule.A()
a.spam()
A .spam
b = mymodule.B()
b.bar()
B.bar
讨论
在这个章节中的主要问题是⼀个设计问题,不管你是否希望⽤户使⽤很多⼩模块或只
是⼀个模块。举个例⼦,在⼀个⼤型的代码库中,你可以将这⼀切都分割成独⽴的⽂
件,让⽤户使⽤⼤量的import语句,就像这样:
from mymodule.a import A
from mymodule.b import B
...
这样能⼯作,但这让⽤户承受更多的负担,⽤户要知道不同的部分位于何处。通常情
况下,将这些统⼀起来,使⽤⼀条import将更加容易,就像这样:
from mymodule import A, B
对后者⽽⾔,让mymodule成为⼀个⼤的源⽂件是最常见的。但是,这⼀章节展⽰了如
何合并多个⽂件合并成⼀个单⼀的逻辑命名空间。 这样做的关键是创建⼀个包⽬录,
使⽤ init .py ⽂件来将每部分粘合在⼀起。
当⼀个模块被分割,你需要特别注意交叉引⽤的⽂件名。举个例⼦,在这⼀章节中,
B类需要访问A类作为基类。⽤包的相对导⼊ from .a import A 来获取。
整个章节都使⽤包的相对导⼊来避免将顶层模块名硬编码到源代码中。这使得重命名
模块或者将它移动到别的位置更容易。 (见10 .3⼩节)
作为这⼀章节的延伸,将介绍延迟导⼊。如图所⽰,init .py⽂件⼀次导⼊所有必需的
组件的。但是对于⼀个很⼤的模块,可能你只想组件在需要时被加载。 要做到这⼀
点,init .py有细微的变化:
# __init__.py
def A():
from .a import A
return A()
def B():
from .b import B
return B()
在这个版本中,类A和类B被替换为在第⼀次访问时加载所需的类的函数。对于⽤
户,这看起来不会有太⼤的不同。 例如:
import mymodule
a = mymodule.A()
a.spam()
A .spam
延迟加载的主要缺点是继承和类型检查可能会中断。你可能会稍微改变你的代码,例
如:
if isinstance( , mymodule.A): # Error
...
if isinstance( , mymodule.a.A): # Ok
...
延迟加载的真实例⼦, 见标准库 multiprocessing/init .py 的源码.
W3Cschool ( )最⼤的技术知识分享与学习 台
此篇内容来⾃于 ⽹站⽤户上传并发布。
文档评论(0)