2012-06-28 54 views
2

有没有办法在python中执行包继承,也就是说包A有模块mod1,mod2和其他一些子包。现在包B应该继承A的所有模块和子包,以便它可以做到import B.mod1在python中的包继承

我已经通过在下面的链接http://peak.telecommunity.com/doc/src/peak/config/modules.html包裹继承部分,但无法import peak.api。我也尝试导入子包的__init__文件中的父包的所有模块,但它没有帮助。

+0

这有点乱,但会'的B进口*'工作?这会在'mod1'和'mod2'而不是'B.mod1'和'B.mod2'中添加'mod1','mod2'等等。 – bouteillebleu

+0

明星导入只能用作python shell中的一个方便捷径。在模块中使用它们对于不可维护的代码来说是一个很好的入口。 –

+0

@brunodesthuilliers在这种情况下,他们有时会被谨慎地使用,如果你只是想把别人的名字空间复制到你的名字空间中。 – katrielalex

回答

0

这是可能的。你所要做的就是在__init__中声明__all__变量,它应该包含你想要公开的所有模块。有关更多信息,请参见Documentation

4
# package B __init__.py 
from A import mod1, mod2, modN 

这就是你所需要的。

0

是的。例如见的源代码numpy__init__.py(Python 2.7版):

import core 
from core import * 
import compat 
import lib 
from lib import * 
import linalg 
import fft 
import polynomial 
import random 
import ctypeslib 
import ma 
import matrixlib as _mat 
from matrixlib import * 

# Make these accessible from numpy name-space 
# but not imported in from numpy import * 
from __builtin__ import bool, int, long, float, complex, \ 
    object, unicode, str 
from core import round, abs, max, min 

__all__.extend(['__version__', 'pkgload', 'PackageLoader', 
      'show_config']) 
__all__.extend(core.__all__) 
__all__.extend(_mat.__all__) 
__all__.extend(lib.__all__) 
__all__.extend(['linalg', 'fft', 'random', 'ctypeslib', 'ma'])