Інший спосіб розширення (зокрема значення, додавання нових методів, а не зміна існуючих) класів, навіть вбудованих, полягає у використанні препроцесора, який додає можливість розширення за межі самого Python, перетворюючи розширення на звичайний синтаксис Python до того, як Python насправді побачить його.
str()
Наприклад, я зробив це, щоб розширити клас Python 2 . str()
є особливо цікавою метою через неявний зв'язок із цитованими даними, такими як 'this'
і 'that'
.
Ось деякий розширювальний код, де єдиним доданим не-Python синтаксисом є extend:testDottedQuad
біт:
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
Після чого я можу написати в коді, поданому на препроцесор:
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'
Препроцесор з’їдає це, випльовує звичайний Python без виправлення мавп, і Python робить те, що я задумав.
Подібно до того, як препроцесор змінного струму додає функціональність до c, так само препроцесор Python може додати функціональність до Python.
Моя реалізація препроцесора завелика для відповіді на переповнення стека, але для тих, кого це може зацікавити, вона знаходиться тут, на GitHub.