Files
python3-cookbook/cookbook/c08/p25_cached_objects.py

118 lines
2.4 KiB
Python
Raw Permalink Normal View History

2015-02-06 14:35:30 +08:00
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
Topic: 创建缓存实例
2019-05-13 11:26:43 +08:00
Desc :
2015-02-06 14:35:30 +08:00
"""
import logging
a = logging.getLogger('foo')
b = logging.getLogger('bar')
print(a is b)
c = logging.getLogger('foo')
print(a is c)
# The class in question
class Spam:
def __init__(self, name):
self.name = name
# Caching support
import weakref
_spam_cache = weakref.WeakValueDictionary()
def get_spam(name):
if name not in _spam_cache:
s = Spam(name)
_spam_cache[name] = s
else:
s = _spam_cache[name]
return s
# Note: This code doesn't quite work
class Spam1:
_spam_cache = weakref.WeakValueDictionary()
def __new__(cls, name):
print('Spam1__new__')
if name in cls._spam_cache:
return cls._spam_cache[name]
else:
self = super().__new__(cls)
cls._spam_cache[name] = self
return self
def __init__(self, name):
print('Initializing Spam')
self.name = name
s = Spam1('Dave')
t = Spam1('Dave')
print(s is t)
class CachedSpamManager:
def __init__(self):
self._cache = weakref.WeakValueDictionary()
def get_spam(self, name):
if name not in self._cache:
s = Spam(name)
self._cache[name] = s
else:
s = self._cache[name]
return s
def clear(self):
self._cache.clear()
class Spam2:
manager = CachedSpamManager()
def __init__(self, name):
self.name = name
2019-05-13 11:26:43 +08:00
def get_spam(name):
return Spam2.manager.get_spam(name)
2015-02-06 14:35:30 +08:00
# ------------------------最后的修正方案------------------------
class CachedSpamManager2:
def __init__(self):
self._cache = weakref.WeakValueDictionary()
def get_spam(self, name):
if name not in self._cache:
temp = Spam3._new(name) # Modified creation
self._cache[name] = temp
else:
temp = self._cache[name]
return temp
def clear(self):
self._cache.clear()
class Spam3:
def __init__(self, *args, **kwargs):
raise RuntimeError("Can't instantiate directly")
# Alternate constructor
@classmethod
def _new(cls, name):
self = cls.__new__(cls)
self.name = name
return self
print('------------------------------')
cachedSpamManager = CachedSpamManager2()
s = cachedSpamManager.get_spam('Dave')
t = cachedSpamManager.get_spam('Dave')
2019-05-13 11:26:43 +08:00
print(s is t)