728x90

WeakValueDictionary 클래스는 객체애 대한 약한 참조를 값으로
가지는 가변 매핑을 구현한다.
참조된 객체가 프로그램 다른 곳에서 가비지 컬렉트되면 해당키도 WeakValueDictonary
에서 자동 제거된다. 이 클래스는 일반적으로 캐시를 구현하기 위해 사용된다.

class Cheese:

    def __init__(self, kind):
        self.kind = kind

    def __repr__(self):
        return 'Cheese(%r)' % self.kind
import weakref
stock = weakref.WeakValueDictionary()
catalog = [Cheese('Red Leicester'), Cheese('Tilsit'),
           Cheese('Brie'), Cheese('Parmesan')]

for cheese in catalog:
    stock[cheese.kind] = cheese

print(sorted(stock.keys()))
del catalog
print(sorted(stock.keys()))
del cheese
print(sorted(stock.keys()))

 

 

catalog 에 들어 있는 각종 치즈가 WeakValueDictionary로
구현되어 있는 stock 배열에 로딩된다. 그런데 catalog를 제거하자마자 stock에
있는 치즈가 하나만 빼고 모두 사라진다.

 

  1. stock 은 WeakValueDictionary 객체다.
  2. stock 은 치즈명을 catalog 에 있는 Cheese 객체에 대한 참조로 매핑한다.
  3. stock 에 모든 치즈명이 들어있다.
  4. catalog 를 제거한 후, 예상한 대로 WeakValueDictionary 객체인 stock에서 대부분의 치즈가 사라졌다.
  5. 그런데 하나가 남아있는 이유는?

Tip - 임시 변수가 객체를 참조함으로써 예상보다 객체의 수명이 늘어날 수 있다.
지역 변수는 함수가 반환되면서 사라지므로 일반적으로 문제가 되지 않는다.
명시적으로 제거하기 전에는 사라지지 않는다.

728x90

'Python > python - pythonic' 카테고리의 다른 글

데코레이터를 이해하기전 알아야 할것들  (0) 2020.12.06
벡터 클래스의 부활  (0) 2020.12.04
약한참조  (2) 2020.12.02
del 과 가비지 컬렉션  (0) 2020.12.02
간단한 데커레이터 구현하기  (0) 2020.11.28