1. My Requirements
- The Decorator Class should use functools.wrapsso it has proper introspection and organization for later.
- Access to the decorated instance should be possible.
- In the example below, I do it by passing a wrapped_selfargument to the__call__method.
 
- In the example below, I do it by passing a 
- As the title states, the Decorator Class must have parameters that you can tune for for each method.
2. An Example of What It Would Look Like
The ideal situation should look something like this:
class A():
    def __init__(self):
        ...
    @LoggerDecorator(logger_name='test.log')
    def do_something(self):
        ...
with the Decorator Class being, so far (basic logger decorator based on a recipe coming from David Beazley's Python Cookbook):
class LoggerDecorator():
    def __init__(self, func, logger_name):
        wraps(func)(self)
        self.logger_name = logger_name
    def config_logger(self):
        ... # for example, uses `self.logger_name` to configure the decorator
    def __call__(self, wrapped_self, *args, **kwargs):
        self.config_logger()
        wrapped_self.logger = self.logger
        func_to_return = self.__wrapped__(wrapped_self, *args, **kwargs)
        return func_to_return
    def __get__(self, instance, cls):
        if instance is None:
            return self
        else:
            return types.MethodType(self, instance)
3. How Do I Fix It?
The error I'm getting refers to __init__ not recognizing a third argument apparently:
TypeError: __init__() missing 1 required positional argument: 'func'
It has been suggested to me that I should be putting func in the __call__ method. However, if I put it there as a parameter, wrapped_self isn't properly read as a parameter and I get this error:
__call__() missing 1 required positional argument: 'wrapped_self'
I've tried many things to fix this issue, including: putting wraps(func)(self) inside __call__; and many variations of this very close but not quite filling all of the requirements solution (the problem with it is that I can't seem to be able to access wrapped_self anymore).
 
     
    