2013-10-22 4 views
15

Betrachten Sie den folgenden Code ein:WeakRef und __slots__

from weakref import ref 

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

k = Klass() 
r = ref(k) 

es funktioniert, aber wenn ich die __slots__ Kommentar- bricht es mit TypeError: "cannot create weak reference to 'Klass' object" unter Python 2.6.

Bitte weiß jemand, ob dies eine inhärente Einschränkung von Python und __slots__ oder wenn es ein Fehler ist? Wie man es umgeht?

Antwort

19

Ohne __weakref__ Variable für jede Instanz, Klassen __slots__ definieren, unterstützen keinen schwachen Verweis auf seine Instanzen. Wenn eine schwache Referenzunterstützung benötigt wird, fügen Sie __weakref__ zu der Zeichenfolge in der __slots__ Deklaration hinzu.

Von der Python documentation.

Wenn Sie hinzufügen __weakref__ zu __slots__, wird Ihr Code funktioniert:

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

Sie haben __weakref__ in die Liste der Slots hinzuzufügen. Es ist eines der __slots__ quirks. Vor 2.3 funktionierte auch das nicht, aber glücklicherweise ist deine Version nicht so alt.

Verwandte Themen