Une autre façon d'étendre (ce qui signifie spécifiquement, d'ajouter de nouvelles méthodes, et non de changer celles existantes) des classes, même intégrées, consiste à utiliser un préprocesseur qui ajoute la possibilité d'étendre hors / au-dessus de la portée de Python lui-même, en convertissant l'extension en la syntaxe normale de Python avant que Python ne puisse la voir.
J'ai fait cela pour étendre la str()
classe de Python 2 , par exemple. str()
est une cible particulièrement intéressante en raison du lien implicite avec des données citées telles que 'this'
et 'that'
.
Voici un code d'extension, où la seule syntaxe non-Python ajoutée est le 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
Après quoi je peux écrire dans le code fourni au préprocesseur:
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'
Le préprocesseur mange ça, crache du Python normal sans monkeypatching, et Python fait ce que je voulais qu'il fasse.
Tout comme le préprocesseur ac ajoute des fonctionnalités à c, un préprocesseur Python peut également ajouter des fonctionnalités à Python.
L'implémentation de mon préprocesseur est trop volumineuse pour une réponse de débordement de pile, mais pour ceux qui pourraient être intéressés, elle est ici sur GitHub.