Outra maneira de estender (especificamente significando, adicionar novos métodos, não alterar os existentes) classes, mesmo as integradas, é usar um pré-processador que adiciona a capacidade de estender para fora / acima do escopo do próprio Python, convertendo a extensão para sintaxe normal do Python antes que o Python realmente consiga vê-la.
Fiz isso para estender a str()
classe do Python 2 , por exemplo. str()
é um alvo particularmente interessante por causa da ligação implícita aos dados citados como 'this'
e 'that'
.
Aqui está um código de extensão, em que a única sintaxe não Python adicionada é o 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
Depois disso, posso escrever no código fornecido ao pré-processador:
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'
O pré-processador come isso, cospe o Python normal sem o monkeypatching, e o Python faz o que eu pretendia fazer.
Assim como um pré-processador ac adiciona funcionalidade a c, também um pré-processador Python pode adicionar funcionalidade ao Python.
Minha implementação de pré-processador é muito grande para uma resposta de estouro de pilha, mas para aqueles que possam estar interessados, ela está aqui no GitHub.