Converter o tipo de função incorporado no tipo de método (no Python 3)

Considere uma função simples como

def increment(self):
    self.count += 1

que é executado através do Cython e compilado em um módulo de extensão. Suponha agora que eu gostaria de fazer desta função um método em uma classe. Por exemplo:

class Counter:
    def __init__(self):
        self.count = 0

from compiled_extension import increment
Counter.increment = increment

Agora isso não funcionará, pois a convenção de chamada no nível C será quebrada. Por exemplo:

>>> c = Counter()
>>> c.increment()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: increment() takes exactly one argument (0 given)

Mas no Python 2, podemos converter a função em um método não vinculado fazendo:

Counter.increment = types.MethodType(increment, None, Counter)

Como posso realizar a mesma coisa no Python 3?

Uma maneira simples é usar um empacotador fino:

from functools import wraps
def method_wraper(f):
    def wrapper(*args, **kwargs):
        return f(*args, **kwargs)
    return wraps(f)(wrapper)

Counter.increment = method_wrapper(increment)

Existe uma maneira mais eficiente de fazer isso?

questionAnswers(2)

yourAnswerToTheQuestion