Python代码, 仿照玩蛇网经典代码单例, 却出现了不是单例的的状态, 帮助看下源码,python源码,实际现象期望实现单例,
Python代码, 仿照玩蛇网经典代码单例, 却出现了不是单例的的状态, 帮助看下源码,python源码,实际现象期望实现单例,
实际现象
期望实现单例, 保持某个属性全局唯一
预期现象
仿照经典实现代码, 却出现了不是单例的情况
我要做什么
实现scheduler全局唯一, 不派生过多的scheduler
重现步骤
拷贝代码
运行之
查看内存地址
相关代码
仿照经典实现
from apscheduler.schedulers.background import BackgroundSchedulerclass Borg(object): __shared_state = {} def __init__(self): self.__dict__ = Borg.__shared_state self.scheduler = BackgroundScheduler() s1 = Borg().schedulers2 = Borg().schedulerprint s1, s2# <apscheduler.schedulers.background.BackgroundScheduler object at 0x02623DF0> # <apscheduler.schedulers.background.BackgroundScheduler object at 0x02D801D0>
我自己想的办法
from apscheduler.schedulers.background import BackgroundSchedulerclass 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 = Borg().schedulers2 = Borg().scheduler
创建一个实例s1,同时初始化属性scheduler,此时的地址是0x02623DF0,再创建一个实例s2,然后修改了属性scheduler,地址为0x02D801D0。s1和s2其实是两个不同实例,只不过他们的属性共用类属性,看起来就像单例的效果。
如果把代码改成这样,应该就能看得更清楚过程:
s1 = Borg()print(s1.scheduler)s2 = Borg()print(s1.scheduler)print(s2.scheduler)print(s1.scheduler is s2.scheduler)
编橙之家文章,
相关内容
- Python SDK 构造上传策略怎么应用,pythonsdk,我在使用 Py
- Python split函数处理str转list的问题,pythonsplit,str1 = "
- python归替RuntimeError是什么错误?,pythonruntimeerror,class S
- Python中使用fork是否适合?,Python使用fork,通常在java开发
- win系统安装scipy失败问题,提示没有BLAS的原因是什么?
- 求教python数组、序列与迭代综合应用问题,python数组
- python 3版本程序在调用shell 指令怎么样才能获得返回值
- psycopg2使用遇到InternalError错误是什么原因,,执行完第
- 在python里面怎么样使用socket连接,pythonsocket连接,尝试连
- python中证明x的平方加上y的平方等于3,没有有理数解?
评论关闭