2013-10-22 1 views
15

는 다음과 같은 코드를 생각해Weakref 및 __slots__

from weakref import ref 

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

k = Klass() 
r = ref(k) 

작동을하지만 난 __slots__의 주석을 해제 할 때 파이썬 2.6에서 TypeError: "cannot create weak reference to 'Klass' object" 함께 나누기.

이것이 파이썬과 __slots__의 고유 한 제한 사항이거나 버그 일 경우 알려주십시오. 어떻게 해결할 수 있을까요? __slots__을 정의하는 각 인스턴스에 대한 __weakref__ 변수없이

답변

19

, 클래스의 인스턴스에 약한 참조를 지원하지 않습니다. 약한 참조 지원이 필요한 경우 __weakref____slots__ 선언의 문자열 시퀀스에 추가합니다.

Python documentation.

당신이 __weakref____slots__에 추가하는 경우

, 당신의 코드가 작동합니다

>>> 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 중 하나입니다. 2.3 이전 버전에서도이 기능이 작동하지 않았지만 운좋게도 버전이 그리 오래되지 않았습니다.

관련 문제