Konvertieren des eingebauten Funktionstyps in einen Methodentyp (in Python 3)

Betrachten Sie eine einfache Funktion wie

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

Das wird über Cython ausgeführt und zu einem Erweiterungsmodul kompiliert. Angenommen, ich möchte diese Funktion jetzt zu einer Methode für eine Klasse machen. Zum Beispiel:

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

from compiled_extension import increment
Counter.increment = increment

Dies wird jetzt nicht funktionieren, da die Aufrufkonvention auf der C-Ebene unterbrochen wird. Zum Beispiel:

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

In Python 2 können wir die Funktion folgendermaßen in eine ungebundene Methode konvertieren:

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

Wie kann ich dasselbe in Python 3 erreichen?

Eine einfache Möglichkeit besteht darin, eine dünne Hülle zu verwenden:

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)

Gibt es eine effizientere Möglichkeit, dies zu tun?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage