Другой способ расширения (в частности, добавления новых методов, а не изменения существующих) классов, даже встроенных, заключается в использовании препроцессора, который добавляет возможность расширяться за пределы / за пределы самого 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 делает то, что я намеревался делать.
Подобно тому, как препроцессор ac добавляет функциональность к c, препроцессор Python также может добавлять функциональность к Python.
Моя реализация препроцессора слишком велика для ответа на вопрос о переполнении стека, но для тех, кому это может быть интересно, она находится здесь, на GitHub.