python weak-references

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.