Say masz starszą moduł o nazwie mod
że używasz tak:
import mod
obj = mod.Object()
obj.method()
mod.function()
# and so on...
I chcesz go przedłużyć, nie zastępując go dla użytkowników. Łatwo zrobić. Możesz nadać nowemu modułowi inną nazwę, newmod.py
lub umieścić go o tej samej nazwie na głębszej ścieżce i zachować tę samą nazwę, np. /path/to/mod.py
. Następnie użytkownicy mogą importować go w jeden z następujących sposobów:
import newmod as mod # e.g. import unittest2 as unittest idiom from Python 2.6
lub
from path.to import mod # useful in a large code-base
w module, będziemy chcieli, aby wszystkie stare nazwy dostępnych:
from mod import *
lub jawnie nazwij każdą importowaną nazwę:
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
Myślę, że import *
będzie łatwiejszy w utrzymaniu w tym przypadku - jeśli moduł podstawowy rozszerzy funkcjonalność, będziesz płynnie nadążać (choć możesz odcień nowych obiektów o tej samej nazwie).
Jeśli rozszerzany mod
ma przyzwoitą wartość __all__
, ograniczy importowane nazwy.
Należy również zadeklarować numer __all__
i rozszerzyć go rozszerzonym modułem o numer __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)
Następnie rozszerzaj obiekty i funkcjonalność w normalny sposób.
class NewObject(object):
def newmethod(self):
"""this method extends Object"""
def newfunction():
"""this function builds on mod's functionality"""
Jeśli nowe obiekty zapewniają funkcjonalność zamierzają zastąpić (lub być może jesteś backport nową funkcjonalność do starszego kodu bazowego) można zastąpić nazwy
Trzeba zadać sobie pytanie, co to jest to próba osiągnięcia tego nie może zostać rozwiązana za pomocą podklasy funkcjonalności z istniejącego modułu. – jathanism
Interesujący wątek w grupie dyskusyjnej Pythona na temat tego, czego początkowo szukałem, doprowadził mnie do tego pytania i odpowiedzi, wątek pochodzi z 13 lat temu: https://mail.python.org/pipermail/python-dev/2002-June /024839.html –