Python Class Based Decorator com parâmetros que podem decorar um método ou função

Vi muitos exemplos de decoradores em Python que são:

ecoradores de estilo de função (agrupando uma funçãecoradores de estilo @class (implementando__init__, __get__ e__call__)decoradores que não aceitam argumentosdecorators que aceitam argumentosecorsores que são "amigáveis ao método" (ou seja, podem decorar um método em uma classdecoradores que são "amigáveis" (podem decorar uma função simplesdecorators que podem decorar métodos e funções

Mas eu nunca vi um único exemplo que possa fazer tudo isso, e estou tendo problemas para sintetizar a partir de várias respostas para perguntas específicas (comoest, est ou este (que tem uma das melhores respostas que eu já vi no SO)), como combinar todas as opções acim

O que eu quero é um baseado em classe decorador que pode decorar um método ou uma função e que requer pelo menos um parâmetro adicional. Ou seja, para que o seguinte funcione:

class MyDecorator(object):
    def __init__(self, fn, argument):
        self.fn = fn
        self.arg = argument

    def __get__(self, ....):
        # voodoo magic for handling distinction between method and function here

    def __call__(self, *args, *kwargs):
        print "In my decorator before call, with arg %s" % self.arg
        self.fn(*args, **kwargs)
        print "In my decorator after call, with arg %s" % self.arg


class Foo(object):
    @MyDecorator("foo baby!")
    def bar(self):
        print "in bar!"


@MyDecorator("some other func!")
def some_other_function():
    print "in some other function!"

some_other_function()
Foo().bar()

E eu esperaria ver:

In my decorator before call, with arg some other func!
in some other function!
In my decorator after call, with arg some other func!
In my decorator before call, with arg foo baby!
in bar!
In my decorator after call, with arg foo baby!

Edit: se importa, estou usando o Python 2.7.

questionAnswers(6)

yourAnswerToTheQuestion