1
junnplus 2017-03-08 20:21:09 +08:00 via iPhone
python 中直接模块级常量就是单例
|
2
wentian OP |
3
Kilerd 2017-03-08 20:38:09 +08:00
单例模式 建议用 __new__,不是用 __init__
|
4
amoyiki 2017-03-08 20:48:25 +08:00 via iPhone
应该用__new__只创建一个实例
|
6
junnplus 2017-03-08 20:57:35 +08:00
你这种写法只是共用一个类变量,但是每次都实例化 BackgroundScheduler
|
7
mooncakejs 2017-03-08 20:59:51 +08:00 via iPhone
@junnplus 正解。
|
8
junnplus 2017-03-08 21:00:42 +08:00
还有,看了你给的链接 https://github.com/faif/python-patterns/blob/master/creational/borg.py
人家写的没错,通过继承共用类变量来实现单例 |
9
wentian OP @junnplus
是不是我还要继承下( 我原以为那个继承, 就是做做样子的, 直接使用基类不就完了 :P ) 但是, 如果我使用 str 之类的, 就和他的完全保持一致了 使用 __new__ , 见过, 但是没有深入了解其原理过 清一色的 Borg 推荐: https://www.google.com/search?q=python+singleton&oq=python+singleton+&aqs=chrome..69i57.6145j0j7&sourceid=chrome&ie=UTF-8 但是都加了一个继承, 看起来那个继承, 不是我认为「多余的」 :P |
12
dsg001 2017-03-08 22:16:40 +08:00
模块,简单安全
|
13
jingniao 2017-03-08 22:52:39 +08:00 via Android
模块变量,简单的多线程锁就这么干的,跑的挺欢的
|
14
lunaticus7 2017-03-09 15:15:24 +08:00
可以试下这个单例装饰器,定义类的时候加在前面就行
#!/usr/bin/env python # -*- coding: utf-8 -*- class SingletonDecorator: def __init__(self, klass): self.klass = klass self.instance = None def __call__(self, *args, **kwds): if self.instance is None: self.instance = self.klass(*args, **kwds) return self.instance |