Konwertuj wbudowany typ funkcji na typ metody (w Pythonie 3)

Rozważmy prostą funkcję

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

który jest uruchamiany przez Cython i wkompilowany w moduł rozszerzenia. Załóżmy teraz, że chciałbym uczynić tę funkcję metodą w klasie. Na przykład:

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

from compiled_extension import increment
Counter.increment = increment

Teraz to nie zadziała, ponieważ konwencja wywołania na poziomie C zostanie przerwana. Na przykład:

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

Ale w Pythonie 2 możemy przekonwertować funkcję na metodę niezwiązaną, wykonując:

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

Jak mogę osiągnąć to samo w Pythonie 3?

Jednym z prostych sposobów jest użycie cienkiego opakowania:

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)

Czy jest na to skuteczniejszy sposób?

questionAnswers(2)

yourAnswerToTheQuestion