Digamos que tiene un módulo más antiguo llamado mod
que utilice la siguiente manera:
import mod
obj = mod.Object()
obj.method()
mod.function()
# and so on...
Y usted desee para ampliarlo, sin reemplazarlo para sus usuarios. Hecho facilmente Puede darle a su nuevo módulo un nombre diferente, newmod.py
o colocarlo con el mismo nombre en una ruta más profunda y mantener el mismo nombre, p. /path/to/mod.py
. A continuación, los usuarios pueden importar en cualquiera de estas maneras:
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
En su módulo, tendrá que hacer todos los viejos nombres disponibles:
from mod import *
o nombre explícitamente cada nombre que importe:
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
Creo que el import *
será más fácil de mantener para este caso de uso: si el módulo base expande la funcionalidad, podrá mantenerse al día (aunque puede sombrear objetos nuevos con el mismo nombre).
Si el mod
que está ampliando tiene un __all__
decente, restringirá los nombres importados.
También debe declarar un __all__
y extenderlo con el módulo extendido __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)
Luego extienda los objetos y la funcionalidad como lo haría normalmente.
class NewObject(object):
def newmethod(self):
"""this method extends Object"""
def newfunction():
"""this function builds on mod's functionality"""
Si los nuevos objetos proporcionan funcionalidad tiene la intención de reemplazar (o tal vez usted está backporting la nueva funcionalidad en una base de código antiguo) puede sobrescribir los nombres
Usted tiene que preguntarse qué es lo que está tratar de lograr eso no se puede resolver subclasando la funcionalidad del módulo existente. – jathanism
hilo de interés en el grupo de noticias de Python sobre lo que estaba buscando originalmente que me llevó a esta sesión de preguntas y respuestas, el hilo es similar, hace 13 años: https://mail.python.org/pipermail/python-dev/2002-June /024839.html –