2013-10-22 8 views
15

Rozważmy następujący kod:Weakref i __slots__

from weakref import ref 

class Klass(object): 
    # __slots__ = ['foo'] 
    def __init__(self): 
     self.foo = 'bar' 

k = Klass() 
r = ref(k) 

to działa, ale kiedy odkomentuj __slots__ zrywa z TypeError: "cannot create weak reference to 'Klass' object" pod Pythona 2.6.

Proszę, czy ktoś wie, czy jest to nieodłączne ograniczenie Pythona i __slots__, czy jest to błąd? Jak obejść go?

Odpowiedz

19

Bez __weakref__ zmiennej dla każdej instancji, klasy definiujące __slots__ nie obsługują słabe odwołania do swoich wystąpień. Jeśli potrzebne jest słabe wsparcie referencyjne, dodaj __weakref__ do sekwencji łańcuchów w deklaracji __slots__.

Od Python documentation.

Jeśli dodać __weakref__ do __slots__, Twój kod będzie działać:

>>> 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 ...> 
4

Trzeba dodać __weakref__ do listy szczelin. To jeden z __slots__ quirks. Przed wersją 2.3 nawet to nie działało, ale na szczęście twoja wersja nie jest tak stara.