Dado un método, ¿cómo devuelvo la clase a la que pertenece en Python 3.3 en adelante?

Dadox = C.f después:

class C:
    def f(self):
        pass

¿A qué llamo?x eso volveráC?

Lo mejor que puedo hacer esexecing una porción analizada dex.__qualname__, que es feo:

exec('d = ' + ".".join(x.__qualname__.split('.')[:-1]))

Para un caso de uso, imagine que quiero un decorador que agregue unsuper llame a cualquier método al que se aplique. ¿Cómo puede ese decorador, que solo recibe el objeto de función, hacer que la clasesuper (el??? abajo)?

def ensure_finished(iterator):
    try:
        next(iterator)
    except StopIteration:
        return
    else:
        raise RuntimeError

def derived_generator(method):
    def new_method(self, *args, **kwargs):
        x = method(self, *args, **kwargs)
        y = getattr(super(???, self), method.__name__)\
            (*args, **kwargs)

        for a, b in zip(x, y):
            assert a is None and b is None
            yield

        ensure_finished(x)
        ensure_finished(y)

    return new_method

Respuestas a la pregunta(1)

Su respuesta a la pregunta