Декоратор перегрузки метода

Я пытаюсь написать декоратор, который предоставляет функциональные возможности перегрузки методов для python, подобные тому, который упоминается в PEP 3124 .

Написанный мной декоратор прекрасно работает с обычными функциями, но я не могу заставить его работать с методами в классе.

Вот декоратор:

class Overload(object):
    def __init__(self, default):
        self.default_function = default
        self.type_map = {}
        self.pos = None

    def __call__(self, *args, **kwargs):
        print self
        try:
            if self.pos is None:
                pos = kwargs.get("pos", 0)
            else:
                pos = self.pos
            print args, kwargs
            return self.type_map[type(args[pos])](*args, **kwargs)
        except KeyError:
            return self.default_function(*args, **kwargs)
        except IndexError:
            return self.default_function(*args, **kwargs)

    def overload(self, *d_type):
        def wrapper(f):
            for dt in d_type:
                self.type_map[dt] = f
            return self
        return wrapper

Когда я пытаюсь реализовать это так:

class MyClass(object):
    def __init__(self):
        self.some_instance_var = 1

    @Overload
    def print_first_item(self, x):
        return x[0], self.some_instance_var

    @print_first_item.overload(str)
    def print_first_item(self, x):
        return x.split()[0], self.some_instance_var

Я получаю TypeError, когда запускаю его :

>>> m = MyClass()
>>> m.print_first_item(1) 
<__main__.Overload object at 0x2> (1,) {} 
Traceback (most recent call last):   
  File "", line 1, in    
  File "overload.py", line 17, in __call__
    return self.default_function(*args, **kwargs) 
  TypeError: print_first_item() takes exactly 2 arguments (1 given)
>>>

. Мой вопрос:Как я могу получить доступ к экземпляруMyClass(то естьself)изнутри украшенного метода?

8
задан Ned Batchelder 7 July 2012 в 00:36
поделиться