Otra forma de extender (específicamente, agregar nuevos métodos, no cambiar los existentes) clases, incluso las integradas, es usar un preprocesador que agrega la capacidad de extender fuera o por encima del alcance de Python, convirtiendo la extensión a sintaxis normal de Python antes de que Python realmente lo vea.
Hice esto para extender la str()clase de Python 2 , por ejemplo. str()es un objetivo particularmente interesante debido al vínculo implícito con datos citados como 'this'y 'that'.
Aquí hay un código de extensión, donde la única sintaxis que no es de Python agregada es el extend:testDottedQuadbit:
extend:testDottedQuad
def testDottedQuad(strObject):
if not isinstance(strObject, basestring): return False
listStrings = strObject.split('.')
if len(listStrings) != 4: return False
for strNum in listStrings:
try: val = int(strNum)
except: return False
if val < 0: return False
if val > 255: return False
return True
Después de lo cual puedo escribir en el código enviado al preprocesador:
if '192.168.1.100'.testDottedQuad():
doSomething()
dq = '216.126.621.5'
if not dq.testDottedQuad():
throwWarning();
dqt = ''.join(['127','.','0','.','0','.','1']).testDottedQuad()
if dqt:
print 'well, that was fun'
El preprocesador se come eso, escupe Python normal sin parchear, y Python hace lo que yo pretendía que hiciera.
Así como el preprocesador de CA agrega funcionalidad ac, también un preprocesador de Python puede agregar funcionalidad a Python.
La implementación de mi preprocesador es demasiado grande para una respuesta de desbordamiento de pila, pero para aquellos que puedan estar interesados, está aquí en GitHub.