2013-10-22 5 views
15

は、次のコードを考えてみましょう。Weakrefと__slots__

これはPythonの固有の制限で、__slots__であるかどうか、またバグであれば誰にも分かりますか?それを回避するには?

答えて

19

を定義しているクラスでは、インスタンスごとに変数がありません。は、インスタンスへの弱い参照をサポートしていません。弱い参照のサポートが必要な場合は、宣言の文字列のシーケンスに__weakref__を追加します。

Python documentationより。

あなたは__slots____weakref__を追加する場合は、あなたのコードは動作します:

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

あなたはスロットのリストに__weakref__を追加する必要があります。それは__slots__ quirksの1つです。 2.3より前のバージョンでも、これはうまくいきませんでしたが、幸いにもあなたのバージョンはそれほど古いものではありません。

関連する問題