monkey patching with @classmethod

Bruno Desthuilliers bruno.42.desthuilliers at websiteburo.invalid
Wed Mar 3 07:09:12 EST 2010


gentlestone a écrit :
> Hi, is there some well-known problems with class method monkey
> patching?
> 
> I've got this error message:
> 
> unbound method get_pocet_neocislovanych() must be called with Pozemok
> instance as first argument (got Subjekt instance instead)

> The method is declared as:
> @classmethod
> @monkeypatch(Dokument)
> def get_pocet_neocislovanych(cls, subjekt):
>     return cls.objects.filter(subjekt = subjekt, cislo__isnull =
> True).count() # or pass, this line is not important
> 
> and the monkey patch decorator is declared as:
> def monkeypatch(cls):
>     def decorator(func):
>         setattr(cls, func.__name__, func)
>         return func
>     return decorator

The decorators are applied in order. So you first add the yet 
undecorated function as an attribute of the class, then pass the 
function to classmethod.

FWIW, this monkeypatch decorator is IMHO a plain waste of time. The 
following code does the same thing and is (IMHO again) *much* more readable:

def get_pocet_neocislovanych(cls, subjekt):
      return cls.objects.filter(
         subjekt=subjekt,
         cislo__isnull= True
         ).count() # or pass, this line is not important

Dokument.get_pocet_neocislovanych=@classmethod(get_pocet_neocislovanych)

Also, Django's BestPractice(tm) is to define such "query" methods on the 
  model's manager, not as a classmethod of the model.

My 2 cents



More information about the Python-list mailing list