부모 (순환 참조)를 참조하는 "불필요한"멤버가 있기 때문에 개체가 삭제되지 않는 refcount 문제가 발생했습니다. 드라이버 특정 물건을하기 위해참조하지 않고 부모 개체에 액세스
class User(object):
__slots__ = ("driver")
def __init__(self, *params):
self.driver = getDriverType(params)()
self.driver.parent = self
def getFancyObject(self):
return FancyObject(self)
class Driver(object):
def __init__(self):
self.parent = None
def specialCode(self):
self.parent.getFancyObject()
...
# driver-specific code doing something with fancyObject
, 나는 여전히 (드라이버가 제공하는 기능을 통해 다시)에만 부모가 제공하는 고급 기능을 필요
다음은 단축 버전입니다. 나는 FancyObject 인스턴스없이 할 수 있었지만, 더 많은 코드를 입력해야했습니다.
물론 parent에 대한이 참조를 생성하면 부모와 드라이버가 모두 파기되지 않습니다.이 드라이버는 Python VM에서 RAM을 차지할뿐만 아니라이 드라이버가 처리하는 하드웨어 리소스도 차지합니다. Sunce가 User
인 모든 인스턴스가 남아 있으면이 문제는 신속하게 응답하지 않는 앱 및 메모리 부족 예외로 확대됩니다.
말할 필요도없이 클래스의 __slots__
은 weakref.ref가 해당 클래스에서 만들어지지 않도록합니다.
필자는이 문제에 너무 빠져있어이 문제에 대한 훌륭한 Pythonic 솔루션을 볼 수 없습니다.
개체 GC를 방지하는 참조를 만들지 않고 원하는 기능을 어떻게 얻을 수 있습니까?
"멋진 객체"를 검색 한 후 상위 참조를 삭제할 수 있습니까? – BrenBarn
아니요, FancyObject를 요구하는 기능이 언제 호출 될지 모르겠습니다. 자주 호출 될 수도 있고 전혀 호출되지 않을 수도 있습니다. – velis