¿Cómo distingue Python la función de devolución de llamada que es miembro de una clase?

Por favor mira el ejemplo simple:

class A:
  def __init__(self, flag):
    self.flag = flag

  def func(self):
    print self.flag

a = A(1)
b = A(2)
callback_a = a.func
callback_b = b.func

callback_a()
callback_b()

El resultado es:

1
2

Se ejecuta como se esperaba. Pero tengo una pregunta. En C, la función de devolución de llamada se pasa como un puntero. En Python, debería tener una forma similar de hacer esto, para que la persona que llama sepa la dirección de la función. Pero en mi ejemplo, no solo se pasa el puntero a la función, sino que también se pasa el parámetro (self), porque el mismo método de la misma clase imprime resultados diferentes. Así que mis preguntas son:

¿Un método así en Python solo tiene una copia en la memoria? Mi significado es que el código de cualquier método solo tiene una copia, y en mi ejemplo, el método no se clonará. Creo que debería tener una sola copia, pero aquí sigo haciendo esta pregunta para obtener más entradas.

Recuerdo que todo en Python es un objeto. Entonces, en mi ejemplo, ¿hay dos instancias de función con parámetros diferentes pero solo una copia de código?