import functools
import types


def function_decorator(f):

    @functools.wraps(f)
    def wrapper(*args, **kwargs):

        print("wrapper", f, args, kwargs)
        return f(*args, **kwargs)

    return wrapper


def class_decorator(cls):

    for name in dir(cls):

        attr = getattr(cls, name)
        if isinstance(attr, types.FunctionType):

            setattr(cls, name, function_decorator(attr))

    return cls


@class_decorator
class Yoba:

    x = 1
    y = 2

    def __init__(self):

        print("Yoba.__init__")

    def foo(self):

        print("Yoba.foo")

    def bar(self):

        print("Yoba.bar")


yoba = Yoba()
yoba.foo()
yoba.bar()
