python - Weakref y__slots__
weak-references (2)
Sin una variable
__weakref__
para cada instancia, las clases que definen__slots__
no admiten referencias débiles a sus instancias. Si se necesita un soporte de referencia débil, entonces agregue__weakref__
a la secuencia de cadenas en la declaración__slots__
.
De la documentación de Python .
Si agrega __weakref__
a __slots__
, su código funcionará:
>>> from weakref import ref
>>>
>>> class Klass(object):
>>> __slots__ = [''foo'', ''__weakref__'']
>>> def __init__(self):
>>> self.foo = ''bar''
>>> k = Klass()
>>> k
=> <__main__.Klass object at ...>
>>> r = ref(k)
>>> r
=> <weakref at ...; to ''Klass'' at ...>
Considere el siguiente código:
from weakref import ref
class Klass(object):
# __slots__ = [''foo'']
def __init__(self):
self.foo = ''bar''
k = Klass()
r = ref(k)
funciona, pero cuando __slots__
el comentario de __slots__
se rompe con TypeError: "cannot create weak reference to ''Klass'' object"
en Python 2.6.
Por favor, ¿alguien sabe si esto es una limitación inherente de Python y __slots__
o si es un error? ¿Cómo evitarlo?
__weakref__
agregar __weakref__
a la lista de ranuras. Es una de las peculiaridades de __slots__
. Antes de la versión 2.3, incluso esto no funcionaba, pero afortunadamente su versión no es tan antigua.