次のように使用するという古いモジュールがあるとmod
します。
import mod
obj = mod.Object()
obj.method()
mod.function()
# and so on...
そして、ユーザーのために置き換えずに拡張したいと考えています。簡単にできます。新しいモジュールに別の名前を付けるnewmod.py
か、より深いパスに同じ名前で配置して、同じ名前のままにすることができます/path/to/mod.py
。その後、ユーザーは次のいずれかの方法でそれをインポートできます。
import newmod as mod # e.g. import unittest2 as unittest idiom from Python 2.6
また
from path.to import mod # useful in a large code-base
モジュールでは、すべての古い名前を利用できるようにする必要があります。
from mod import *
または、インポートするすべての名前を明示的に指定します。
from mod import Object, function, name2, name3, name4, name5, name6, name7, name8, name9, name10, name11, name12, name13, name14, name15, name16, name17, name18, name19, name20, name21, name22, name23, name24, name25, name26, name27, name28, name29, name30, name31, name32, name33, name34, name35, name36, name37, name38, name39
このユースケースでは、の方が保守しやすいと思います。import *
ベース モジュールが機能を拡張すると、シームレスに追いつくことができます (ただし、同じ名前の新しいオブジェクトをシェーディングする可能性があります)。
mod
拡張している にまともな がある場合、__all__
インポートされる名前が制限されます。
また、 を宣言__all__
し、拡張モジュールの で拡張する必要があります__all__
。
import mod
__all__ = ['NewObject', 'newfunction']
__all__ += mod.__all__
# if it doesn't have an __all__, maybe it's not good enough to extend
# but it could be relying on the convention of import * not importing
# names prefixed with underscores, (_like _this)
次に、通常どおりにオブジェクトと機能を拡張します。
class NewObject(object):
def newmethod(self):
"""this method extends Object"""
def newfunction():
"""this function builds on mod's functionality"""
新しいオブジェクトが、置き換える予定の機能を提供する場合 (または、新しい機能を古いコード ベースにバックポートしている場合)、名前を上書きできます。