有沒有辦法在python中執行包繼承,也就是說包A有模塊mod1,mod2和其他一些子包。現在包B應該繼承A的所有模塊和子包,以便它可以做到import B.mod1
。在python中的包繼承
我已經通過在下面的鏈接http://peak.telecommunity.com/doc/src/peak/config/modules.html包裹繼承部分,但無法import peak.api
。我也嘗試導入子包的__init__
文件中的父包的所有模塊,但它沒有幫助。
有沒有辦法在python中執行包繼承,也就是說包A有模塊mod1,mod2和其他一些子包。現在包B應該繼承A的所有模塊和子包,以便它可以做到import B.mod1
。在python中的包繼承
我已經通過在下面的鏈接http://peak.telecommunity.com/doc/src/peak/config/modules.html包裹繼承部分,但無法import peak.api
。我也嘗試導入子包的__init__
文件中的父包的所有模塊,但它沒有幫助。
這是可能的。你所要做的就是在__init__
中聲明__all__
變量,它應該包含你想要公開的所有模塊。有關更多信息,請參見Documentation。
# package B __init__.py
from A import mod1, mod2, modN
這就是你所需要的。
是的。例如見的源代碼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'])
這有點亂,但會'的B進口*'工作?這會在'mod1'和'mod2'而不是'B.mod1'和'B.mod2'中添加'mod1','mod2'等等。 – bouteillebleu
明星導入只能用作python shell中的一個方便捷徑。在模塊中使用它們對於不可維護的代碼來說是一個很好的入口。 –
@brunodesthuilliers在這種情況下,他們有時會被謹慎地使用,如果你只是想把別人的名字空間複製到你的名字空間中。 – katrielalex