monkey patching with @classmethod

gentlestone tibor.beck at hotmail.com
Wed Mar 3 14:45:27 CET 2010


On 3. Mar., 13:09 h., Bruno Desthuilliers <bruno.
42.desthuilli... at websiteburo.invalid> wrote:
> 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

thx, I changed my definitions to manager style and have no more
problems

seems to be safe to use manager instead classmethod - do not know
why :-)



More information about the Python-list mailing list