Diciamo che avete un modulo più vecchio chiamato mod
che si utilizza in questo modo:
import mod
obj = mod.Object()
obj.method()
mod.function()
# and so on...
e si vuole estendere, senza sostituirla per gli utenti. Facilmente fatto. Puoi dare al tuo nuovo modulo un nome diverso, newmod.py
o posizionarlo con lo stesso nome in un percorso più profondo e mantenere lo stesso nome, ad es. /path/to/mod.py
. Quindi gli utenti possono importare in uno dei seguenti modi:
import newmod as mod # e.g. import unittest2 as unittest idiom from Python 2.6
o
from path.to import mod # useful in a large code-base
Nel modulo, ti consigliamo di fare tutti i vecchi nomi disponibili:
from mod import *
o denominare esplicitamente ogni nome che si importa:
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
Penso che lo import *
sarà più manutenibile per questo caso d'uso - se il modulo base espande la funzionalità, continuerai senza problemi (anche se potresti ombreggiare nuovi oggetti con lo stesso nome).
Se il mod
si sta estendendo ha un __all__
decente, limiterà i nomi importati.
È inoltre necessario dichiarare un __all__
ed estenderlo con il modulo esteso __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)
quindi estendere gli oggetti e le funzionalità come si farebbe normalmente.
class NewObject(object):
def newmethod(self):
"""this method extends Object"""
def newfunction():
"""this function builds on mod's functionality"""
Se i nuovi oggetti forniscono funzionalità che si intende sostituire (o forse si sta backport la nuova funzionalità in una base di codice più vecchio) è possibile sovrascrivere i nomi
Bisogna chiedersi che cosa è sei cercando di ottenere risultati che non possono essere risolti per te sottoclassi la funzionalità dal modulo esistente. – jathanism
Interessante discussione sul gruppo di notizie su Python su ciò che cercavo in origine mi ha portato a questo Q & A, il thread è simile a 13 anni fa: https://mail.python.org/pipermail/python-dev/2002-June /024839.html –