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:testDottedQuad
bit:
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.