De acuerdo con la documentación para el módulo weakref:
En lo que sigue, el término referente significa que el objeto que se hace referencia por una referencia débil.
Una referencia débil para un objeto no es suficiente para mantener el objeto vivo: cuando los que quedan referencias a un referente son referencias débiles, basura colección es libre para destruir el referente y volver a utilizar su memoria para algo más.
Qué está sucediendo con MyCallbackA es que usted está sosteniendo una referencia a ella en los casos de A, gracias a -
self.MyCallbackA = MyCallbackA
Ahora, no hay ninguna referencia a la MyCallbackB método vinculado en el código. Se mantiene solo en .__ clase __.__ dict__ como método independiente. Básicamente, se crea un método vinculado (y se le devuelve) cuando lo hace self.methodName. (AFAIK, un método enlazado funciona como una propiedad -utilizando un descriptor (solo lectura): al menos para las nuevas clases de estilo. Estoy seguro de que algo similar, es decir, sin descripciones, sucede para las clases de estilo antiguo. Lo dejo a alguien con más experiencia para verificar la afirmación sobre las clases de estilo antiguo). Por lo tanto, self.MyCallbackB muere tan pronto como se crea el weakref, ¡porque no hay una referencia fuerte para él!
Mis conclusiones se basan en: -
import weakref
#Trace is called when the object is deleted! - see weakref docs.
def trace(x):
print "Del MycallbackB"
class A(object):
def __init__(self):
def MyCallbackA():
print 'MyCallbackA'
self.MyCallbackA = MyCallbackA
self._testA = weakref.proxy(self.MyCallbackA)
print "Create MyCallbackB"
# To fix it, do -
# self.MyCallbackB = self.MyCallBackB
# The name on the LHS could be anything, even foo!
self._testB = weakref.proxy(self.MyCallbackB, trace)
print "Done playing with MyCallbackB"
def MyCallbackB(self):
print 'MyCallbackB'
def test_a(self):
self._testA()
def test_b(self):
self._testB()
if __name__ == '__main__':
a = A()
#print a.__class__.__dict__["MyCallbackB"]
a.test_a()
salida
Crear MyCallbackB
Del MycallbackB
terminado de jugar con MyCallbackB
MyCallbackA
Nota:
Intenté verificar esto para las clases de estilo anteriores. Resultó que "a.test_a de impresión .__ get__" salidas -
<method-wrapper '__get__' of instancemethod object at 0xb7d7ffcc>
para los nuevos y viejos clases de estilo. Por lo tanto, puede que no sea realmente un descriptor, simplemente algo similar a un descriptor. En cualquier caso, el punto es que un objeto de método vinculado se crea cuando accedes a un método de instancia a través de uno mismo, y a menos que mantengas una referencia fuerte al mismo, se eliminará.
para Python 3 sustituir '' item.im_func' con elemento .__ func__' y '' item.im_self' con elemento .__ self__' – lou
Puede ser que necesite '' def __eq __ (self, otro): devuelve otros() == self() ''? ¿Es ese el mejor patrón de comparación? (y probablemente '' __ne__'' como el inverso) – Rafe