Скажем, у вас есть старый модуль с именем 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"""
Если новые объекты предоставляют функциональность, которую вы собираетесь заменить (или, возможно, вы переносите новую функциональность в более старую базу кода), вы можете перезаписать имена