associação pythonbrasil[11] django zope/plone planet Início Logado como (Entrar)

Diferenças para "ReceitaMonkeyPatch"

Diferenças entre as versões de 1 e 8 (7 versões de distância)
Revisão 1e 2008-02-01 18:19:04
Tamanho: 1581
Comentário:
Revisão 8e 2008-09-26 14:07:14
Tamanho: 1790
Editor: localhost
Comentário: converted to 1.6 markup
Deleções são marcadas assim. Adições são marcadas assim.
Linha 3: Linha 3:
Dica do próprio GuidoVanRossum para simplificar a tecnica do "Monkey Patch" (adicionar metodos numa classe já definida). Dica do próprio GuidoVanRossum para simplificar a tecnica do [[http://en.wikipedia.org/wiki/Monkey_patch|"Monkey Patch"]] (adicionar metodos numa classe já definida).
Linha 5: Linha 5:

Nenhuma das técnicas permite fazer monkeypatching em tipos built-in ou qualquer outro definido em C.
Linha 17: Linha 19:
Segundo, uma "metaclasse" (ok, uma factory function que serve como metaclasse) para adicionar metodos (outros atributos) para uma classe pre-existente, com uma conveniente definição de classe Segundo, uma "metaclasse" (ok, uma factory function que serve como metaclasse) para adicionar metodos (ou outros atributos quaisquer) para uma classe pre-existente, com uma conveniente definição de classe
Linha 19: Linha 21:
#!python
Linha 40: Linha 43:
Isso vai adicionar <newmethod> a <someclass>. Isso vai adicionar {{{<newmethod>}}} a {{{<someclass>}}}.
Linha 54: Linha 57:
Isso vai adicionar <method1> e <method2> a <someclass>, e criar <newclass> como um "apelido" para <someclass>. Isso vai adicionar {{{<method1>}}} e {{{<method2>}}} a {{{<someclass>}}}, e criar <newclass> como um "apelido" para {{{<someclass>}}}.
Linha 61: Linha 64:
Nome do autor da Receita EduardoDeOliveiraPadoan

Receita: Monkeypatching

Dica do próprio GuidoVanRossum para simplificar a tecnica do "Monkey Patch" (adicionar metodos numa classe já definida). Fonte: http://mail.python.org/pipermail/python-dev/2008-January/076194.html

Nenhuma das técnicas permite fazer monkeypatching em tipos built-in ou qualquer outro definido em C.

Código

Primeiro, um decorator para adicionar um unico metodo a uma classe:

   1 def monkeypatch_method(cls):
   2     def decorator(func):
   3         setattr(cls, func.__name__, func)
   4         return func
   5     return decorator

Segundo, uma "metaclasse" (ok, uma factory function que serve como metaclasse) para adicionar metodos (ou outros atributos quaisquer) para uma classe pre-existente, com uma conveniente definição de classe

   1 def monkeypatch_class(name, bases, namespace):
   2     assert len(bases) == 1, "Exactly one base class required"
   3     base = bases[0]
   4     for name, value in namespace.iteritems():
   5         if name != "__metaclass__":
   6             setattr(base, name, value)
   7     return base

Exemplo de uso

Decorator:

   1 from <somewhere> import <someclass>
   2 
   3 @monkeypatch_method(<someclass>)
   4 def <newmethod>(self, args):
   5     return <whatever>

Isso vai adicionar <newmethod> a <someclass>.

Metaclass:

   1 from <somewhere> import <someclass>
   2 
   3 class <newclass>(<someclass>):
   4     __metaclass__ = monkeypatch_class
   5     def <method1>(...): ...
   6     def <method2>(...): ...
   7     ...

Isso vai adicionar <method1> e <method2> a <someclass>, e criar <newclass> como um "apelido" para <someclass>.

Volta para CookBook.


EduardoDeOliveiraPadoan