Angenommen, Sie haben ein älteres Modul mod
, die Sie wie folgt verwenden genannt:
import mod
obj = mod.Object()
obj.method()
mod.function()
# and so on...
Und Sie wollen, sie zu verlängern, ohne dass es für die Benutzer zu ersetzen. Einfach gemacht. Sie können Ihrem neuen Modul einen anderen Namen geben, newmod.py
, oder es unter demselben Namen auf einem tieferen Pfad platzieren und denselben Namen beibehalten, z. /path/to/mod.py
. Dann können Ihre Benutzer es in einem der folgenden Wege importieren:
import newmod as mod # e.g. import unittest2 as unittest idiom from Python 2.6
oder
from path.to import mod # useful in a large code-base
In Ihrem Modul, sollten Sie alle alten Namen zur Verfügung stellen:
from mod import *
oder nennen Sie jeden importierten Namen explizit:
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
Ich denke, die import *
wird für diesen Anwendungsfall wartungsfreundlicher sein - wenn das Basismodul die Funktionalität erweitert, werden Sie nahtlos Schritt halten (obwohl Sie neue Objekte mit dem gleichen Namen schattieren könnten).
Wenn die mod
Sie erweitern, hat eine anständige __all__
, wird es die importierten Namen beschränken.
Sie sollten auch einen __all__
deklarieren und es mit dem erweiterten Modul __all__
erweitern.
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)
Dann erweitern Sie die Objekte und Funktionen wie gewohnt.
class NewObject(object):
def newmethod(self):
"""this method extends Object"""
def newfunction():
"""this function builds on mod's functionality"""
Wenn die neuen Objekte Funktionalität anbieten wollen Sie ersetzen (oder vielleicht sind Zurückportieren Sie die neue Funktionalität in einem älteren Code-Basis) können Sie die Namen überschreiben können
Sie haben sich zu fragen, was es Sie sind Der Versuch, dies zu erreichen, kann für Sie nicht gelöst werden, indem Sie die Funktionalität vom vorhandenen Modul ableiten. – jathanism
Interessanter Thread in der Python-News-Gruppe zu dem, was ich ursprünglich gesucht habe, führte mich zu diesem Q & A, Thread ist wie, vor 13 Jahren: https://mail.python.org/pipermail/python-dev/2002-June /024839.html –