期望实现单例, 保持某个属性全局唯一
仿照经典实现代码, 却出现了不是单例的情况
实现scheduler全局唯一, 不派生过多的scheduler
拷贝代码
运行之
查看内存地址
仿照经典实现
from apscheduler.schedulers.background import BackgroundScheduler
class Borg(object):
__shared_state = {}
def __init__(self):
self.__dict__ = Borg.__shared_state
self.scheduler = BackgroundScheduler()
s1 = Borg().scheduler
s2 = Borg().scheduler
print s1, s2
# <apscheduler.schedulers.background.BackgroundScheduler object at 0x02623DF0>
# <apscheduler.schedulers.background.BackgroundScheduler object at 0x02D801D0>
我自己想的办法
from apscheduler.schedulers.background import BackgroundScheduler
class Borg(object):
@classmethod
def get_scheduler(cls):
try:
cls_scheduler = cls.scheduler
except AttributeError as e:
cls.scheduler = BackgroundScheduler()
return cls.scheduler
else:
return cls_scheduler
bs1 = Borg.get_scheduler()
bs2 = Borg.get_scheduler()
bs3 = Borg.get_scheduler()
print bs1, bs2, bs3
# <apscheduler.schedulers.background.BackgroundScheduler object at 0x02752D70>
# <apscheduler.schedulers.background.BackgroundScheduler object at 0x02752D70>
# <apscheduler.schedulers.background.BackgroundScheduler object at 0x02752D70>
产品版本: Python 2.7 APScheduler最新
操作系统: Linux
Github链接, 经典实现: https://github.com/faif/pytho...
이 전형적인 예는 순수한 싱글톤이 아니라 싱글톤 특성을 지닌
Brog
패턴이라고 볼 수 있습니다.마법은
으아악Brog
클래스가 공유하는 클래스 속성 사전__shared_state
을 사용하는 데 있으며, 나중에 생성된 인스턴스는 이전 인스턴스의__dict__
을 덮어씁니다.인스턴스를 생성
s1
하고 동시에scheduler
속성을 초기화합니다. 이때 주소는0x02623DF0
이고 다른 인스턴스s2
를 생성한 다음scheduler
속성을 수정하면 다음과 같습니다.0x02D801D0
.s1
과s2
은 실제로는 서로 다른 두 인스턴스이지만 해당 속성은 클래스 속성을 공유하므로 싱글톤처럼 보입니다.코드를 이렇게 변경하면 프로세스를 더 명확하게 볼 수 있습니다.
으아악