2012-06-28 100 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'])